C# 在WinForms应用程序中使用Unity并使用持有DBContext的类时释放DBContext
我有一个使用Unity for DI的N层WinForms应用程序。主管道的启动如下所示:C# 在WinForms应用程序中使用Unity并使用持有DBContext的类时释放DBContext,c#,winforms,dependency-injection,inversion-of-control,unity-container,C#,Winforms,Dependency Injection,Inversion Of Control,Unity Container,我有一个使用Unity for DI的N层WinForms应用程序。主管道的启动如下所示: static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var container = new UnityContainer(); container.RegisterType<IProductReques
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var container = new UnityContainer();
container.RegisterType<IProductRequestRepository, MDIS.DAL.Repositories.Specific.ProductRequestRepository>();
container.RegisterType<IProductRequestServices, ProductRequestServices>();
var form = container.Resolve<MdisMain>();
Application.Run(form);
}
我还从存储库中删除了DBContext内部实例,并将其放入UnitOfWork类中。上面的示例允许我的UnitOfWork类使用其内部DBContext进行实例化,并将其传递到表单中,以便在存储库调用中使用。当表单关闭时,UnitOfWork将被释放,这将导致其Dispose实现运行并释放表单使用的DBContext。每次打开表单时,我都会得到DBContext的一个新实例。当我在应用程序开始时使用Unity容器时,它保存在ProductRequestServices类实例的单个实例上,这导致了无法释放DBContext的问题。手动尝试释放DBContext只会导致更多问题,所以这种方法现在就可以了 解决这一问题的建议是:
- 确保每次调用某个服务来执行某项工作时,它在完成工作后立即被释放(这需要它不具有状态)
- 将依赖项注入从构造函数参数切换到基于属性的参数
private void detailReportListToolStripMenuItem_Click_1(object sender, EventArgs e)
{
using (UnitOfWork aUnitOfWork = new UnitOfWork())
{
ProductRequestServices aProductRequestServices = new ProductRequestServices(aUnitOfWork);
ProductRequestList aProductRequestList = new ProductRequestList(aProductRequestServices);
aProductRequestList.ShowDialog();
aProductRequestList.Close();
}
}