You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
IUnitOfWorkunitOfWork=serviceProvider.GetService<IUnitOfWork>();// 如果需要事务操作,要手动启用事务unitOfWork.EnableTransaction();// do something 事务的业务操作unitOfWork.Commit();
publicclassFoo1Service{publicvoidFooMethod(){IUnitOfWorkunitOfWork=serviceProvider.GetService<IUnitOfWork>();unitOfWork.EnableTransaction();// do something 事务的业务操作unitOfWork.Commit();}}publicclassFoo2Service{publicvoidFooMethod(){IUnitOfWorkunitOfWork=serviceProvider.GetService<IUnitOfWork>();unitOfWork.EnableTransaction();// do something 事务的业务操作unitOfWork.Commit();}}
在Controller中调用Service
publicclassFooController{privatereadonlyFoo1Service_foo1Service;privatereadonlyFoo2Service_foo2Service;publicFooController(Foo1Servicefoo1Service,Foo2Servicefoo2Service){_foo1Service=foo1Service;_foo2Service=foo2Service;}publicvoidFooAction(){IUnitOfWorkunitOfWork=serviceProvider.GetService<IUnitOfWork>();unitOfWork.EnableTransaction();// do something 事务的业务操作_foo1Service.FooMethod();_foo2Service.FooMethod();unitOfWork.Commit();}}
您的功能请求与现有问题有关吗?请描述
同为
Scoped
的IUnitOfWorkManager
,IUnitOfWork
,DbContextBase
的设计存在重复,参考 #120 的建议进行简化描述您想要的解决方案
需求分析
Scoped
生命周期中,使用一个IUnitOfWork
管理所有的DbContext
实例DbContext
实例以DbConnection
分组,同一个连接对象DbConnection
的多个上下文共享事务DbConnection
的数据上下文DbContext
缓存,获取数据上下文实例时,优先从缓存获取,不存在再从IServiceProvider
中解析IUnitOfWork
需要调用IUnitOfWork.EnableTransaction()
手动开启事务,才能执行手动事务流程,否则使用 EFCore 默认的自动事务IUnitOfWork.EnableTransaction()
和IUnitOfWork.Commit()
进行包裹IUnitOfWork.EnableTransaction()
时,给事务层次打标记,以处理事务嵌套的问题,IUnitOfWork.Commit()
提交事务时只提交最外一层的事务工作单元设计
IUnitOfWork
工作单元使用
1. 使用
ServiceLifetime.Scoped
生命周期将IUnitOfWork
注册到DI2. 从DI解析
IUnitOfWork
对象,将事务代码包裹在IUnitOfWork.EnableTransction()
与IUnitOfWork.Commit()
之间框架内提供了一个简化的获取
IUnitOfWork
的扩展方法调用时,按传入的
enableTransaction
决定是否启用事务工作单元嵌套
利益于
IUnitOfWork.EnableTransaction()
的设计,IUnitOfWork
事务已经支持嵌套,只要保持层次结构中IUnitOfWork.EnableTransction()
与IUnitOfWork.Commit()
成对出现,事务提交时,如果不是最外层工作单元,事务提交会跳过,直到最外层事务时,才会执行真正的IUnitOfWork.Commit()
。因此,在业务实现时,可以按需要随意设计事务功能,在事务互相调用时,不会因为事务嵌套产生多次提交事务的冲突。在Controller中调用Service
如上,
FooController
调用了Foo1Service
和Foo2Service
形成事务嵌套,Foo1Service
和Foo2Service
的事务提交将被跳过,直到FooController
中的unitOfWork.Commit()
,事务提交才真正的执行。The text was updated successfully, but these errors were encountered: