【发布时间】: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