Autofac+Castle实现AOP事务

一、前言

最近公司新项目,需要搭架构进行开发,其中需要保证事务的一致性,经过一番查找,发现很多博文都是通过Spring.Net、Unity、PostSharp、Castle Windsor这些方式实现AOP的。但是这不是我想要的,因此一番查找后,使用Autofac、DynamicProxy该方式实现AOP。


二、使用AOP的优势

博主觉得它的优势主要表现在:

  • 将通用功能从业务逻辑中抽离出来,就可以省略大量重复代码,有利于代码的操作和维护。

  • 在软件设计时,抽出通用功能(切面),有利于软件设计的模块化,降低软件架构的复杂程度。也就是说通用的功能就是一个单独的模块,在项目的主业务里面是看不到这些通用功能的设计代码的。


三、引用库

  • Autofac:4.6

  • Autofac.Extras.DynamicProxy:4.1.0

  • Castle.Core:3.2.2


四、实现思路

4.1 定义属性

定义属性,通过当前方法是否包含该属性进行判断开启事务,如果存在该属性则开启事务,否则忽略事务。
事务属性可以设置超时时间、事务范围以及事务隔离级别。
代码如下:

/// <summary>/// 开启事务属性/// </summary>[AttributeUsage(AttributeTargets.Method,Inherited = true)]public class TransactionCallHandlerAttribute:Attribute{    /// <summary>/// 超时时间/// </summary>public int Timeout { get; set; }    /// <summary>/// 事务范围/// </summary>public TransactionScopeOption ScopeOption { get; set; }    /// <summary>/// 事务隔离级别/// </summary>public IsolationLevel IsolationLevel { get; set; }    public TransactionCallHandlerAttribute()    {Timeout = 60;ScopeOption=TransactionScopeOption.Required;IsolationLevel=IsolationLevel.ReadCommitted;}
}

4.2 切面实现

获取当前方法是否包含TransactionCallHandlerAttribute该属性,如果有该属性则开启事务。
本人在此处加入开发模式判断,用于没设置MSDTC产生异常的问题,如果不需要可忽略。
另外日志功能自行实现即可。
代码如下:

/// <summary>
/// 事务 拦截器
/// </summary>
public class TransactionInterceptor:IInterceptor{  
   //可自行实现日志器,此处可忽略/// <summary>/// 日志记录器/// </summary>private static readonly ILog Logger = Log.GetLog(typeof(TransactionInterceptor));    // 是否开发模式private bool isDev = false;  
 public void Intercept(IInvocation invocation)    {      
   if (!isDev){MethodInfo methodInfo = invocation.MethodInvocationTarget;            if (methodInfo == null){methodInfo = invocation.Method;}TransactionCallHandlerAttribute transaction =methodInfo.GetCustomAttributes<TransactionCallHandlerAttribute>(true).FirstOrDefault();            if (transaction != null){TransactionOptions transactionOptions = new TransactionOptions();                //设置事务隔离级别transactionOptions.IsolationLevel = transaction.IsolationLevel;                //设置事务超时时间为60秒transactionOptions.Timeout = new TimeSpan(0, 0, transaction.Timeout);                using (TransactionScope scope = new TransactionScope(transaction.ScopeOption, transactionOptions)){                
                          try{                        //实现事务性工作invocation.Proceed();scope.Complete();}                
                         catch (Exception ex){                        // 记录异常throw ex;}}}            else{                // 没有事务时直接执行方法invocation.Proceed();}}        else{            // 开发模式直接跳过拦截invocation.Proceed();}} }

4.3 切面注入

博主对Autofac进行了封装,可能与你们的配置不一样,但是,Load(ContainerBuilder builder)该方法内容是一致的,因此注入方式一致的。
通过定义IDependency空接口方式,需要注入的类则继承该接口即可。
代码如下:

/// <summary>
/// 应用程序IOC配置
/// </summary>

public class IocConfig : ConfigBase{    // 重写加载配置protected override void Load(ContainerBuilder builder)    {        var assembly = this.GetType().GetTypeInfo().Assembly;builder.RegisterType<TransactionInterceptor>();builder.RegisterAssemblyTypes(assembly).Where(type => typeof(IDependency).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract).AsImplementedInterfaces().InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(TransactionInterceptor));} }

五、例子

/// <summary>
/// 添加文章
/// </summary>
/// <param name="name"></param>

[TransactionCallHandler]
public void AddArticle(string name){BasArticle model=new BasArticle();model.ArticleID = Guid.Empty;//故意重复,判断是否会回滚。model.Code = TimestampId.GetInstance().GetId();model.Name = name;model.Status = 1;model.Creater = "测试";model.Editor = "测试";    
this._basArticleRepository.Insert(model);             }

相关文章: 

  • ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

  • 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

  • Dora.Interception: 一个为.NET Core度身定制的AOP框架

  • Asp.Net Core轻量级Aop解决方案:AspectCore

  • .Net中的AOP系列之《AOP实现类型》

原文地址:http://www.cnblogs.com/jianxuanbing/p/7199457.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天,我们就来抽个奖!

前言&#xff1a;在日常生活中&#xff0c;我们经常会用到一些抽奖的功能&#xff0c;比如公司年会上的抽奖环节&#xff0c;班级随机点名回答问题的小程序&#xff0c;随机点名系统的程序可以看这里&#xff1a;&#xff0c;那你知道类似的抽奖功能是怎么实现的吗&#xff1f;…

Spring Boot 最核心的 3 个注解详解

转载自 Spring Boot 最核心的 3 个注解详解 最近面试一些 Java 开发者&#xff0c;他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过。 然而&#xff0c;当我问他们 Spring Boot 最核心的 3 个注解是什么&#xff0c;令我失望的是鲜有人能答上来…

刚刚,改造了下BaseDao……

今天在上课的时候&#xff0c;带着学生们写底层的jdbc连接数据库并且对数据表进行增删改查&#xff0c;写的那就一个痛苦啊……从创建实体类到写Dao层代码再到表现层的Jsp页面&#xff0c; 写了好久好久……终于写完了&#xff01;&#xff01;&#xff01;其实吧&#xff0…

ssl2340-格子游戏【并查集】

正题 题目链接 大意 有两个人在玩游戏&#xff0c;在一个n*n的矩阵的点上画线&#xff0c;有如果有线封了圈那么游戏结束&#xff0c;给出一些操作&#xff0c;求在那一轮结束了游戏&#xff0c;或没有结束游戏。 解题思路 用并查集把点相连&#xff0c;直到并查集形成环为…

ASP.NET Core MVC 过滤器介绍

过滤器的作用是在 Action 方法执行前或执行后做一些加工处理。使用过滤器可以避免Action方法的重复代码&#xff0c;例如&#xff0c;您可以使用异常过滤器合并异常处理的代码。 过滤器如何工作&#xff1f; 过滤器在 MVC Action 调用管道中运行&#xff0c;有时称为过滤器管…

dubbo小项目

完整Dubbo项目演示 1 原型 1.1 部门显示&#xff0c;显示全部部门信息 1.2 员工新增 1.3 查看部门员工 2 按照分布式架构进行设计项目 设定员工管理和部门管理不在同一个模块中&#xff0c;需要有一个员工管理项目和一个部门管理项目。 为了方便&#xff0c;不去每个项…

如何构建一套高可用的 APP 消息推送平台

转载自 如何构建一套高可用的 APP 消息推送平台 消息推送作为移动 APP 运营中的一项关键技术&#xff0c;已经被越来越广泛的运用。本文追溯了推送技术的发展历史&#xff0c;剖析了其核心原理&#xff0c;并对推送服务的关键技术进行深入剖析&#xff0c;围绕消息推送时产生…

为什么要有周考?周考是用来干什么的?

周考已经实行一年多的时间了&#xff0c;目前唯一用来检测学生们水平的可能就是周考的成绩了&#xff0c;不过&#xff0c;周考成绩也很能说明一切&#xff0c;每周周考的题目和范围都是本周所学知识&#xff0c;如果周考的成绩很差&#xff0c;那么可以很肯定的说&#xff0c;…

POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】

正题 题目链接 大意 有n头奶牛&#xff0c;奶牛们会认为有些奶牛很受欢迎&#xff0c;受欢迎会互相传递&#xff0c;如:如果A认为B很受欢迎&#xff0c;而B认为C受欢迎&#xff0c;那么A也会认为C是受欢迎的。然后求每一个奶牛都认为受欢迎的奶牛数量。 解题思路 先用tarjan…

.NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序

一、前言 为什么选择VS Code&#xff1f;VS Code 是一款跨平台的代码编辑器&#xff0c;想想他的哥哥VS&#xff0c;并是微软出品的宇宙第一IDE&#xff0c;那作为VS的弟弟&#xff0c;VS Code 也不会差&#xff0c;毕竟微软出品。反正ken是这么认为的本篇开发环境&#xff1f…

zookeeper not connected

问题&#xff1a; 异常信息&#xff1a; zookeeper not connected 异常场景&#xff1a; spring boot dubbo 启动时&#xff0c;连接zk出现问题 解决方案&#xff1a; 1、 检查zk所在机的防火墙。 systemctl stop firewalld | service firewalld stop 2、 检查zk所在机的ip和y…

Redis 5.0 正式版发布了,19 个新特性

转载自 Redis 5.0 正式版发布了&#xff0c;19 个新特性 Redis 5.0 GA 正式版发布了&#xff01; 下载地址&#xff1a; download.redis.io/releases/redis-5.0.0.tar.gz 源码下载&#xff1a; github.com/antirez/redis/releases/tag/5.0.0 先看一下 Redis 5 带来的更新内容…

晨读,难道只是为了完成任务而读的吗?

前两天&#xff0c;看到一篇“湖北恩施的一名学生早读课上大汗淋漓”的文章&#xff0c;不禁想起了我们班的早读。01早读情况除周一升旗以外&#xff0c;其余的学习日都是有早读的&#xff0c;但是早读的利用率有多少就不得而知了。一般在前一天布置作业的时候&#xff0c;作业…

P1197-星球大战【并查集,图论】

正题 题目链接 大意 有n个星球&#xff0c;有一些双向通道连接星球&#xff0c;将一些星球实施打击。求开始和每一次打击后的联通块数量。 解题思路 可以尝试一下逆向思维&#xff0c;把摧毁改为连接&#xff0c;然后倒着输出。 代码 #include<cstdio> #include<i…

代码调用NullPointerException(NPE)

异常信息&#xff1a; 空指针异常 场景&#xff1a; 控制调用服务代码发生异常 服务代码调用mapper发生异常 解决方案&#xff1a; 找到异常发生的行&#xff0c;找方法调用过程"."&#xff0c; 如&#xff1a;xxxService.xxx()。通常都是这个xxxService为null&#…

AOP in dotnet :AspectCore的参数拦截支持

距离上一篇AspectCore的介绍发布已经很长一段时间了&#xff0c;这篇文章也早该和大家见面&#xff0c;最近一直忙于适应新工作&#xff0c;并在业余时间有幸向何镇汐&#xff0c;Savorboard&#xff0c;农夫&#xff0c;AlexLEWIS等几位大牛请教学习&#xff0c;收获颇多。另一…

GitHub 发布了一款重量级产品,可直接运行代码

转载自 GitHub 发布了一款重量级产品&#xff0c;可直接运行代码 【导读】10月16日&#xff0c;GitHub Universe开发者大会如期举行&#xff0c;并重磅推出GitHub Actions&#xff0c;平台主管Sam Lambert称&#xff0c;这将是GitHub历史上最大的改变。此外&#xff0c;GitHu…

“老师,请您多关注一下我吧!!!”

一个班&#xff0c;有学习好的&#xff0c;有学习差的&#xff1b;有喜欢表现的&#xff0c;也有不喜欢表现的。01爱表现的类型&#xff1a;第一种&#xff0c;喜欢表现的学生平时总是让时不时的让老师关注到他&#xff0c;比如上课和老师积极互动的&#xff0c;老师问一个问题…

【2018.3.31】模拟赛之一-ssl2406 约数【水题】

前言 其实水题我是真的不想写的&#xff0c;但是没有办法 正题 大意 一个数&#xff0c;输出他的所有除数和 代码 #include<cstdio> #include<cmath> using namespace std; int n,s; int main() { // freopen("bri.in","r",stdin); // fr…

.NET Core 事件总线,分布式事务解决方案:CAP

背景 相信前面几篇关于微服务的文章也介绍了那么多了&#xff0c;在构建微服务的过程中确实需要这么一个东西&#xff0c;即便不是在构建微服务&#xff0c;那么在构建分布式应用的过程中也会遇到分布式事务的问题&#xff0c;那么 CAP 就是在这样的背景下诞生的。 最初打算做…