当前位置: 首页 > 编程语言 > C#

EFObjectContext、服务和存储库-管理上下文生命周期,分享

时间:2023-04-11 03:08:25 C#

EFObjectContext、服务和存储库-管理上下文生命周期。我是MVP和实体框架世界的新手,所以请多多包涵。我目前有一个View+Presenter组合,视图有两个事件Edit和Delete,presenter只听这些事件。我还有一个服务对象和存储库设置。服务层采用一些采用ObjectContext的存储库实现,因此构造顺序是(将顶级对象传递给它下面的对象:ObjectContext|VRepositories|VServiceObject|VPresenter现在问题是当我在top当objectcontext存在时,它会持久化并且presenter是alive的,这意味着编辑和删除使用服务中相同的context实例。所以,调用ServiceObject.Delete和ServiceObject.Edit会使用相同的context,这使得它变得困难管理更改跟踪。据我所知,上下文应该只是一个单一的工作单元是短暂的,编辑和删除对我来说是不同的工作。你如何使用实体框架进行DI并仍然管理上下文生命周期?我看到人们只是对象上下文是在存储库中新创建的,这是一个很好的模式。或者我应该在服务对象中这样做,例如:ServiceObject{publicvoidEdit(//someargs){Using(varcontext=newMyObjectContext){varrepo=newMyRepo(上下文);varentity=repo.GetForID(12);//为编辑做一些事情context.SaveChanges();但是,如果我这样做,我将不再保存传递给ServiceObject的构造函数而不执行DI的存储库:(。在这种情况下我该怎么办?有谁知道我能看到的任何开源项目可以帮助我这个。谢谢。我将从顶部(演示者)开始,描述参与者之间的关系。Presenter通过依赖获取服务对象。服务功能使用契约来概述:classPresenter{publicPresenter(IServiceservice){...}}从特定的数据访问层实现中抽象出服务实现。基本上,每当服务执行某些需要数据源交互的操作时,它都会创建一个工作单元的实例,并在完成后将其处理掉。接口IService{voidDo();}类服务:IService{privatereadonlyIUnitOfWorkFactoryunitOfWorkFactory;公共服务(IUnitOfWorkFactoryunitOfWorkFactory){this.unitOfWorkFactory=unitOfWorkFactory;}publicvoidDo(){//每当我们需要执行一些数据操作时,我们都会创建并稍后处理//处理工作抽象单元。它是通过工厂创建的,以避免//对特定实现的依赖。using(IUnitOfWorkunitOfWork=this.unitOfWorkFactory.Create()){//工作单元保存EntityFrameworkObjectContext,因此它使用//创建存储库并传播它们这个ObjectContext以与IRepositoryrepository=unitOfWork.Create();repository.DoSomethingInDataSource();//当我们完成更改时,必须提交更改,这基本上意味着提交//基础对象上下文的更改。unitOfWork.Commit();}}}//////表示实现工厂。///公共接口IUnitOfWorkFactory{//////创建实现实例。//////创建实例。IUnitOfWork创建();}//////维护受业务事务影响的对象列表,并协调///更改的写出和并发问题的解决。///publicinterfaceIUnitOfWork:IDisposable{//////创建并初始化指定类型的存储库。//////要创建的存储库类型。///创建的存储库实例。//////创建的存储库不得缓存以供将来使用,因为一旦这个///被处置,它们将无法正常工作。///TRepositoryCreate();//////提交对此所做的更改。///无效提交();}//////表示s的工厂。///publicclassUnitOfWorkFactory:IUnitOfWorkFactory{私有只读IUnityContainer容器;//////初始化类的新实例。/////////用于管理creati的依赖注入容器实例关于存储库///和实体翻译器。///publicUnitOfWorkFactory(IUnityContainercontainer){this.conainer=container;}//////创建实现实例。//////创建实例。publicIUnitOfWorkCreate(){varunitOfWork=this.container.Resolve();unitOfWork.SetupObjectContext();返回工作单元;}...为清楚起见,其他成员省略了}IUnitOfWork的实现接收IUnityContainer的实例,然后创建子容器并在那里注册ObjectContext实例。该子容器将用于创建存储库并传播ObjectContext。这是IUnitOfWork的简化实现:以上是C#学习教程:EFObjectContext,ServiceandRepository-ManagingContextLifecycle。分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多注意—classUnitOfWork:IUnitOfWork{privatereadonlyIUnityContainercontainer;私有ObjectContextobjectContext;公共UnitOfWork(IUnityContainer容器){this.container=container.CreateChildContainer();}publicvoidSetupObjectContext(){this.objectContext=...//在这里创建对象上下文this.container.RegisterInstance(context.GetType(),context);}publicvoidCreate(){//只要我们在子容器中注册了创建的对象上下文实例//它现在就可以在resolvereturnthis.container.Resolve();期间对存储库可用}publicvoidCommit(){this.objectContext.SaveChanges();}}classRepository:IRepository{privatereadonlySomeObjectContextobjectContext;publicRepository(SomeObjectContextobjectContext){this.objectContext=objectContext;}publicvoidDoSomethingInDataSource(){//你可以在这里使用对象上下文实例来完成工作}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: