• .NetCore学习笔记:三、基于AspectCore的AOP事务管理


    AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

    AspectCore 提供了一个全新的轻量级和模块化的Aop解决方案,现在已经支持Asp.Net Core。

    实现AOP类TransactionalAttribute:

     1 /// <summary>
     2 /// 为工作单元提供事务一致性
     3 /// </summary>
     4 public class TransactionalAttribute : AbstractInterceptorAttribute
     5 {
     6     IUnitOfWork _unitOfWork { get; set; }
     7 
     8     public async override Task Invoke(AspectContext context, AspectDelegate next)
     9     {
    10         try
    11         {
    12             _unitOfWork = context.ServiceProvider.GetService(typeof(IUnitOfWork)) as IUnitOfWork;
    13             _unitOfWork.BeginTransaction();
    14             await next(context);
    15             _unitOfWork.Commit();
    16         }
    17         catch (Exception)
    18         {
    19             _unitOfWork.Rollback();
    20             throw;
    21         }
    22     }
    23 }

    这里需要引用AspectCore.Abstractions.dll库,代码中的UnitOfWork类在前面的文章中有讲解:.NetCore学习笔记:一、UnitOfWork工作单元

    在读写数据库的时候,将_unitOfWork.DbTransaction加入。下面这个是Dapper的Execute实例:

     _unitOfWork.DbConnection.Execute(sql, param: param, transaction: _unitOfWork.DbTransaction, commandType: commandType);

    为Web应用程序添加配置:

     1 public class Program
     2 {
     3     public static void Main(string[] args)
     4     {
     5         CreateHostBuilder(args).Build().Run();
     6     }
     7 
     8     public static IHostBuilder CreateHostBuilder(string[] args) =>
     9         Host.CreateDefaultBuilder(args)
    10         .ConfigureWebHostDefaults(webBuilder =>
    11         {
    12             webBuilder.UseStartup<Startup>();
    13         })          
    14         .UseDynamicProxy();//aspcectcore
    15 }

    在netcore3.1中配置比较简单,只需要在Program类中添加UseDynamicProxy()就可以了。

    这样在需要用到事务的地方我们使用[Transactional]标注一下就可以了。

     1 public class TestService : ITestService
     2 {
     3     ITestDomain _testDomain { get; set; }
     4     public TestService(ITestDomain testDomain)
     5     {
     6         this._testDomain = testDomain;
     7     }
     8 
     9     public Test Get(string id)
    10     {
    11         var test = _testDomain.Get(id);
    12         return test;
    13     }
    14 
    15     [Transactional]
    16     public void Insert(List<Test> list)
    17     {
    18         _testDomain.InsertList(list);
    19     }
    20 }

    上段代码中的ITestDomain实现:

    public class TestDomain : ITestDomain
    {
        IRepository<Test> _testRepository { get; set; }
        public TestDomain(IRepository<Test> testRepository)
        {
            this._testRepository = testRepository;
        }
    
        public Test Get(string id)
        {
            return _testRepository.Get(id);
        }
    
        public void Insert(List<Test> list)
        {
            if (list == null)
                return;
            foreach(var item in list)
                _testRepository.Insert(item);
        }
    }

    代码片段中的Repository在前面的文章中有讲解:.NetCore学习笔记:二、基于Dapper的泛型Repository

    这样就实现AOP事务了。

  • 相关阅读:
    Android SQLite 建立多表间的主外键关系 Binary
    Android——扩大ImageButton的点击区域 Binary
    Android——刷新媒体库 Binary
    Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令 转自:南水江的鸽子窝
    在同一应用中混合使用ASP.NET窗体和ASP.NET MVC 转自:geez的个人空间
    ASP.NET WebApplication 发布部署
    Oracle 导出索引Sequence!!
    获取ORACLE 表字段,表名,以及主键之类等等的信息
    FlexGrid 控件的使用 摘自:大道至简
    整合 DZNT到自己网站
  • 原文地址:https://www.cnblogs.com/dongshenjun/p/12773211.html
Copyright © 2020-2023  润新知