本節(jié)目錄
成都創(chuàng)新互聯(lián)專注于田家庵企業(yè)網站建設,自適應網站建設,商城開發(fā)。田家庵網站建設公司,為田家庵等地區(qū)提供建站服務。全流程定制網站制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
介紹
UOW(全稱UnitOfWork)是指工作單元.
在Abp中,工作單元對于倉儲和應用服務方法默認開啟。并在一次請求中,共享同一個工作單元.
同時在Abp中,不僅支持同一個數據庫連接,還支持事務處理.
分析Abp源碼
1.UnitOfWorkRegistrar
![[Architect] Abp 框架原理解析(5) UnitOfWork](/upload/otherpic52/153348.jpg)
2.ComponentRegistered
![[Architect] Abp 框架原理解析(5) UnitOfWork](/upload/otherpic52/153350.jpg)
3.IsConventionalUowClass
![[Architect] Abp 框架原理解析(5) UnitOfWork](/upload/otherpic52/153351.jpg)
4.Intercept
![[Architect] Abp 框架原理解析(5) UnitOfWork](/upload/otherpic52/153353.jpg)
5.PerformSyncUow
![[Architect] Abp 框架原理解析(5) UnitOfWork](/upload/otherpic52/153354.jpg)
實現(xiàn)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; }
}
|
實現(xiàn)uow,在uow中會提供db的創(chuàng)建,這樣才能管理到每個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()
{
}
}
|
定義與實現(xiàn)倉儲層,這里不再做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);
}
}
|
定義與實現(xiàn)應用層
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; }
}
|
定義與實現(xiàn)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)));
}
}
|
執(zhí)行
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<IInterceptor, UnitOfWorkInterceptor>());//先注入攔截器
container.Register(Component.For<IUnitOfWork, EfUnitOfWork>());
container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
container.Register(Component.For<ITaskAppService, TaskAppService>());
container.Register(Component.For<ITaskRepository, TaskRepository>());
var person = container.Resolve<ITaskAppService>();
person.CreateTask(new CreateTaskInput() { Name = "3333" });
}
Console.ReadKey();
}
|
會自動在application method的結尾調用Complete.
另外也可以在uow上定義option為啟用事務.在本例中稍作擴展即可實現(xiàn).
新聞名稱:[Architect]Abp框架原理解析(5)UnitOfWork
標題鏈接:http://chinadenli.net/article32/gspcsc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計公司、動態(tài)網站、響應式網站、外貿網站建設、小程序開發(fā)、App設計
廣告
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創(chuàng)新互聯(lián)