[Architect]Abp框架原理解析(5)UnitOfWork-创新互联

本节目录

建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。创新互联建站专业提供成都网站制作、成都网站设计,网页设计,网站制作(企业站、成都响应式网站建设、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!
  • 介绍

  • 分析Abp源码

  • 实现UOW

介绍

UOW(全称UnitOfWork)是指工作单元.

在Abp中,工作单元对于仓储和应用服务方法默认开启。并在一次请求中,共享同一个工作单元.

同时在Abp中,不仅支持同一个数据库连接,还支持事务处理.

分析Abp源码

1.UnitOfWorkRegistrar

[Architect] Abp 框架原理解析(5) UnitOfWork

2.ComponentRegistered

[Architect] Abp 框架原理解析(5) UnitOfWork

3.IsConventionalUowClass

[Architect] Abp 框架原理解析(5) UnitOfWork

4.Intercept

[Architect] Abp 框架原理解析(5) UnitOfWork

5.PerformSyncUow

 [Architect] Abp 框架原理解析(5) UnitOfWork

实现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 { getset; }

}

实现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 { getset; }

    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 { getset; }

    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 { getset; }

}

定义与实现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://scyanting.com/article/djigsj.html