.NetCore学习笔记:三、基于AspectCore的AOP事务管理
AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AspectCore 提供了一个全新的轻量级和模块化的Aop解决方案,现在已经支持Asp.Net Core。
实现AOP类TransactionalAttribute:
/// <summary>
/// 为工作单元提供事务一致性
/// </summary>
public class TransactionalAttribute : AbstractInterceptorAttribute
{
IUnitOfWork _unitOfWork { get; set; } public async override Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
_unitOfWork = context.ServiceProvider.GetService(typeof(IUnitOfWork)) as IUnitOfWork;
_unitOfWork.BeginTransaction();
await next(context);
_unitOfWork.Commit();
}
catch (Exception)
{
_unitOfWork.Rollback();
throw;
}
}
}
这里需要引用AspectCore.Abstractions.dll库,代码中的UnitOfWork类在前面的文章中有讲解:.NetCore学习笔记:一、UnitOfWork工作单元。
在读写数据库的时候,将_unitOfWork.DbTransaction加入。下面这个是Dapper的Execute实例:
_unitOfWork.DbConnection.Execute(sql, param: param, transaction: _unitOfWork.DbTransaction, commandType: commandType);
为Web应用程序添加配置:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseDynamicProxy();//aspcectcore
}
在netcore3.1中配置比较简单,只需要在Program类中添加UseDynamicProxy()就可以了。
这样在需要用到事务的地方我们使用[Transactional]标注一下就可以了。
public class TestService : ITestService
{
ITestDomain _testDomain { get; set; }
public TestService(ITestDomain testDomain)
{
this._testDomain = testDomain;
} public Test Get(string id)
{
var test = _testDomain.Get(id);
return test;
} [Transactional]
public void Insert(List<Test> list)
{
_testDomain.InsertList(list);
}
}
上段代码中的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事务了。
源码地址:https://github.com/letnet/NetCoreDemo
.NetCore学习笔记:三、基于AspectCore的AOP事务管理的更多相关文章
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- Spring学习笔记(五):JDBCTemplate+事务管理
1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...
- Java框架spring 学习笔记(十九):事务管理(注解管理)
注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 <?xml version="1.0" encoding="UTF-8"?> ...
- JVM学习笔记三:垃圾收集器及内存管理策略
垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域 ...
- MySQL学习笔记三:库和表的管理
1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...
- Spring Boot学习笔记(七)多数据源下的事务管理
DataBaseConfig中加入事务管理器 DataBaseConfig的详解以及多数据源的配置参见我的上一篇文章 @Configuration @MapperScan(basePackages={ ...
- Spring AOP事务管理(使用切面把事务管理起来)
在<Spring Transaction 分析事务属性(事务的基本概念.配置)>基础上 http://blog.csdn.net/partner4java/article/details/ ...
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- jenkins SSH发布文件 Publish over SSH
jenkins 构建完成后需要一键发布,结构如下 A服务器 svn B服务器 jenkins C服务器 应用服务器 B从A拉取代码后打包成war,然后向C服务器拷贝war包 这里解决的就是远程拷贝问题 ...
- ISO14229系列之二:诊断指令格式和相关概念
作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4458658.html 1. 简单的通信机制 其实诊断通信的机制很简单,可以类比client-s ...
- telnet命令连接服务器端
win7: (1).使用telnet命令: 控制面板--->程序--->打开或关闭Windows功能--->Telnet客户端[勾选] (2)连接(cmd) eg:telnet ww ...
- javascript中onclick(this)用法介绍
this指触发事件的对象 代码如下: <input id="myinput" type="text" value="javascript中onc ...
- js将已有数组重新分组(将数组每10项分成一组)
项目中碰到的一个小需求:分页请求数据,一次请求60条,需要将后台返回的数组每10条分成一组渲染一个表格(表格使用的是ant-design-vue的table) 实现逻辑: var chunk = 10 ...
- JMeter接口测试响应数据中乱码问题解决方法
乱码产生原因: 结果处理编码与被测对象的编码不一致,JMeter是默认按照ISO-8859-1编码格式进行解析. 解决方法一: 根据接口文档或者找开发确认项目编码是哪种,因为有的项目用的是GBK,有的 ...
- Properties(hashtable的子类)
Properties: Properties是hashtable的子类(在java.util包中).该集合的特点:可以用于键值对形式的配置文件,且不允许Key重复,若有重复的,后者会覆盖前者. 也就是 ...
- mysql--容器无法启动
mysql服务总是在重启状态 查看mysql容器日志 # docker logs 镜像名称 InnoDB: If this error appears when you are creating an ...
- c语言心形告白代码实现
c语言心形告白代码实现 1.彩色告白 include<stdio.h> include<math.h> include<windows.h> include< ...
- 【React Native】某个页面禁用物理返回键
1.引入组件 import { BackHandler, } from 'react-native'; 2.添加监听 componentDidMount(): void { BackHandler.a ...