我有一个带有棱镜Dryioc 7.1的Xamarin Forms应用程序,我遇到了以下问题:在上一个操作完成之前,在此上下文中启动了第二个操作。
这解决了我的问题,直到我在XF应用程序上添加选项卡页面,因为所有选项卡页面同时初始化,我有并发服务类访问我的DBContext,我假设它们是不同的实例,至少在它们是创建他们有一个不同的GUID,但似乎每次我的DBContext被处置,处置所有DBContext实例,我在XF创建一个简单的标签页应用程序与Prism复制我的问题,当我在Web服务器上使用我的DBContext我创建范围但是有了棱镜,我似乎无法做到,因为如果我尝试在我的服务类上注入IContainerRegistry和IContainerProvider,那么我的应用程序就不起作用了。
我到处寻找,我找不到在服务页面上创建范围的方法
我的生成DbContext接口只有一个方法
public IApplicationDbContext GenerateNewContext()
{
IApplicationDbContext dbContext = new ApplicationDbContext(_sqlite);
return dbContext;
}
我的数据存储通过IGenerateDbContext访问DbContext
using (IApplicationDbContext myDbContext = _generateDbContext.GenerateNewContext())
{
....
removed for simplicity
}
这里有完整的应用程序https://github.com/silvajnr/PrismTabbedDbContext
我读到棱镜为每个ViewModel创建一个DBContext,应该只是将DBConetx与Mutex锁同步
错误:System.ObjectDisposedException:无法访问已处置的对象。此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。对象名:'ApplicationDbContext'。
感谢博客文章:Xamarin:Prism 7 https://codesandchips.blog/2018/05/31/xamarin-getting-started-with-prism-7/入门
告诉我如何手动解决服务。
var _appContainer = (App.Current as PrismApplication).Container.GetContainer();
using (var scope = _appContainer.OpenScope())
{
IApplicationDbContext myDbContext = scope.Resolve<IGenerateDbContext>().GenerateNewContext();
...
}