C# 在WinForms应用程序中使用Unity并使用持有DBContext的类时释放DBContext

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

我有一个使用Unity for DI的N层WinForms应用程序。主管道的启动如下所示:

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只会导致更多问题,所以这种方法现在就可以了

解决这一问题的建议是:

  • 确保每次调用某个服务来执行某项工作时,它在完成工作后立即被释放(这需要它不具有状态)
  • 将依赖项注入从构造函数参数切换到基于属性的参数
这应该确保每次调用处理数据库的服务时,都会得到一个全新的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();
    }
}