[Architect]Abp框架原理解析(5)UnitOfWork-创新互联
本节目录
建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。
创新互联建站专业提供
成都网站制作、成都网站设计,网页设计,网站制作(企业站、
成都响应式网站建设、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!
介绍
UOW(全称UnitOfWork)是指工作单元.
在Abp中,工作单元对于仓储和应用服务方法默认开启。并在一次请求中,共享同一个工作单元.
同时在Abp中,不仅支持同一个数据库连接,还支持事务处理.
分析Abp源码
1.UnitOfWorkRegistrar
2.ComponentRegistered
3.IsConventionalUowClass
4.Intercept
5.PerformSyncUow
实现UOW
定义IUnitOfWork
1 2 3 4 5 6 7 8 9 10 11 12 | public interface IUnitOfWork
{
//1.开启事务
//2.设置Filter(本例中不做演示)
void Begin(UnitOfWorkOptions options);
void Complete();
}
public class UnitOfWorkOptions
{
public bool ? IsTransactional { get ; set ; }
}
|
实现uow,在uow中会提供db的创建,这样才能管理到每个db.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class EfUnitOfWork : UnitOfWorkBase
{
public static DbContext DbContext { get ; set ; }
public static DbContext GetDbContext()
{
if (DbContext == null )
{
DbContext = new DemoDb();
}
return DbContext;
}
public override void Begin(UnitOfWorkOptions options)
{
if (options.IsTransactional == true )
{
CurrentTransaction = new TransactionScope();
}
}
public TransactionScope CurrentTransaction { get ; set ; }
public override void Complete()
{
SaveChanges();
if (CurrentTransaction != null )
{
CurrentTransaction.Complete();
}
}
private void SaveChanges()
{
DbContext.SaveChanges();
}
}
public abstract class UnitOfWorkBase : IUnitOfWork
{
public virtual void Begin(UnitOfWorkOptions options)
{
}
public virtual void Complete()
{
}
}
|
定义与实现仓储层,这里不再做DbProvider.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public interface IRepository
{
}
public interface ITaskRepository : IRepository
{
void Add(Task task);
}
public class TaskRepository : ITaskRepository
{
public void Add(Task task)
{
var db = (DemoDb)EfUnitOfWork.GetDbContext();
db.Tasks.Add(task);
}
}
|
定义与实现应用层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public interface IApplicationService
{
}
public interface ITaskAppService : IApplicationService
{
void CreateTask(CreateTaskInput input);
}
public class TaskAppService : ITaskAppService
{
private ITaskRepository _repository;
public TaskAppService(ITaskRepository repository)
{
_repository = repository;
}
public void CreateTask(CreateTaskInput input)
{
_repository.Add( new Task(input.Name));
}
}
public class CreateTaskInput
{
public string Name { get ; set ; }
}
|
定义与实现uow拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | internal class UnitOfWorkInterceptor : IInterceptor
{
private IUnitOfWork _unitOfWork;
public UnitOfWorkInterceptor(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void Intercept(IInvocation invocation)
{
_unitOfWork.Begin( new UnitOfWorkOptions());
invocation.Proceed();
_unitOfWork.Complete();
}
}
|
定义在IApplicationService与IRepository接口下拦截
1 2 3 4 5 6 7 8 | static void Kernel_ComponentRegistered( string key, Castle.MicroKernel.IHandler handler)
{
var type = handler.ComponentModel.Implementation;
if ( typeof (IApplicationService).IsAssignableFrom(type) || typeof (IRepository).IsAssignableFrom(type))
{
handler.ComponentModel.Interceptors.Add( new InterceptorReference( typeof (UnitOfWorkInterceptor)));
}
}
|
执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static void Main( string [] args)
{
using ( var container = new WindsorContainer())
{
container.Register(Component.For()); //先注入拦截器
container.Register(Component.For());
container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
container.Register(Component.For());
container.Register(Component.For());
var person = container.Resolve();
person.CreateTask( new CreateTaskInput() { Name = "3333" });
}
Console.ReadKey();
}
|
会自动在application method的结尾调用Complete.
另外也可以在uow上定义option为启用事务.在本例中稍作扩展即可实现.
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享文章:[Architect]Abp框架原理解析(5)UnitOfWork-创新互联
网站URL:
http://pwwzsj.com/article/djigsj.html