【问题标题】:Disposing UnitOfWork处理 UnitOfWork
【发布时间】:2016-01-20 19:27:01
【问题描述】:

我的问题是如何在使用 EF6、Prism Unity、MVVM、WPF 和本地数据库的桌面应用程序中处理 UnitOfWork。每次创建视图时,我都想创建和处理 UnitOfWork(包括其 DbContext)。

当用户选择一个菜单项时,SubMenuViewModel 激活所选视图。例如,如果我选择 AdrTypeView,SubMenuViewModel 会这样做:

using (CallingCreateUoWASync())
{
RegionManager.RegisterViewWithRegion(RegionNames.MainRegionLeft, typeof(AdrTypeView));
}

Prism 的 RegisterViewWithRegion 方法创建和激活视图。我正在从 SubMenuViewModel 异步创建 EntityUnitOfWork,以便可以在加载视图时创建 DbContext。

private async Task CreateUoWASync()
    {
     await Task.Run(() =>
     {
         EntityUnitOfWork MyUnitOfWork = new EntityUnitOfWork();

     });
    }

显示 AdrTypeView 后,如果我从 SubMenuViewModel 中选择另一个视图,AdrTypeView 将从区域中消失,为该区域中的新视图让路,原因是 AdrTypeViewModel 实现了 IRegionMemberLifetime,并将 KeepAlive 设置为 false。

问题是 MyUnitOfWork 的实例仍然存在,它引用了 AdrType 存储库。


编辑:我认为我的问题的答案更多地与如何从 EntityUnitOfWork 的单例实例更改为为每个视图创建 EntityUnitOfWork 的新实例。

我从moduleinit类中删除了EntityUnitOfWork的容器注册,即。

     Container.RegisterType<EntityUnitOfWork, EntityUnitOfWork("EntityUnitOfWork");

所以我根本没有为 EntityUnitOfWork 做任何容器注册。尽管如此,在我更改和处置视图后,EntityUnitOfWork 的单例实例仍然存在。当我这样做时,我可以看到旧值:

 EntityUnitOfWork _unitOfWork = ServiceLocator.Current.GetInstance<EntityUnitOfWork>();

那么如何使用 Container.RegisterType 或 Container.RegisterInstance 处理 EntityUnitOfWork?我可能更愿意以编程方式处理该实例。谢谢。

【问题讨论】:

  • 你为什么要使用任务来实例化你的工作单元?
  • 另外,IRegionMemberLifetime 仅在使用 Prim 的导航框架时使用。
  • Tseng,你能告诉我另一种异步方式吗?就像我说的,我想在加载视图的同时创建 UnitOfWork,因为创建 DbContext 并不是最快的过程。
  • IRegionMemberLifetime 用于清除该区域以供另一个视图使用。有没有更好的方法在更改视图时自动清除区域?
  • 创建实体框架 DbContext 是一种快速操作。初始化 DbContext 几乎没有成本,除非您在派生类中执行一些时髦的操作,例如查询,例如执行查询,这是不行的。类的构建应该很快,如果你做一些需要很长时间的事情,你就做错了。你测试过吗?

标签: wpf entity-framework mvvm prism dbcontext


【解决方案1】:

使用using 时会隐式调用 dispose 方法。

// Context gets disposed when leaving the using block
using (var uow = CallingCreateUoWASync())
{
    // do something with uow
    uow.Add(...);
    uow.SaveChanges();
}

如果你不使用using 那么你必须显式调用.Dispose() 方法。

【讨论】:

  • 对,明白了。即使 SubMenuViewModel 将 IRegionMemberLifetime KeepAlive 设置为 false,由于某种原因,当我选择另一个视图时,MyEntityUnitOfWork 仍然没有被清除。当我选择另一个视图时,我可以在调试器中看到旧值:EntityUnitOfWork _unitOfWork = ServiceLocator.Current.GetInstance();
  • 首先,仅仅因为你释放了一个对象并不意味着它会立即释放内存。释放只释放非托管内存(指针、文件句柄等),托管对象在下次 GC 执行时释放。其次,您不应该将 UoW 的生命周期与视图模型绑定,而是将其绑定到命令(假设您有带有用户列表的 ViewModel。您进行更改,然后单击“保存”按钮。在保存按钮,您将获得 uow 的一个实例,添加/更新您的条目,然后调用 save 并在离开 using 块时自动处理它)
  • 编辑:我的问题中有一个错字,方法名称与 using 语句匹配,即。私有异步任务调用CreateUoWASync()。对于用户可以选择查看和编辑的每个数据文件,都有一个单独的 using 语句。我的代码应该可以工作,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多