91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-06 05:27:10 來源:網絡 閱讀:422 作者:鄒君安 欄目:網絡安全

本節目錄

  • 介紹

  • 分析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<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為啟用事務.在本例中稍作擴展即可實現.


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瑞丽市| 象州县| 安顺市| 宣汉县| 探索| 阆中市| 中牟县| 屯昌县| 乡宁县| 四子王旗| 新昌县| 卓资县| 驻马店市| 岑溪市| 石柱| 弋阳县| 义马市| 霍林郭勒市| 蒙阴县| 嘉义县| 安徽省| 澄迈县| 洛隆县| 辽中县| 陵川县| 民和| 织金县| 咸阳市| 马龙县| 宜阳县| 宿迁市| 循化| 宁晋县| 建水县| 卢湾区| 深泽县| 德钦县| 包头市| 沐川县| 吉林市| 大渡口区|