利用AOP实现SqlSugar自动事务
发布时间:2019-11-07 02:00

_cache保存sqlsugar实例,_threadlocal确保同一线程下取出的是同一个sqlsugar实例。

不知道sqlsugar判断当前实例是否已经开启事务,所以又将sqlsugar包了一层。

 public class sqlclient
 public sqlsugarclient sqlsugarclient;
 public bool isbegintran = false;
 public int trancount = 0;
 public sqlclient
 this.sqlsugarclient = sqlsugarclient;

isbegintran标识当前sqlsugar实例是否已经开启事务,trancount是一个避免事务嵌套的计数器。

一开始的例子

 [transactioncallhandler]
 public ilist student getstudentlist
 var list = mstudentda.getstudents;
 var value = mvalueservice.findall;
 return list;

transactioncallhandler表明该方法要开启事务,但是如果mvalueservice.findall也标识了transactioncallhandler,又要开启一次事务?所以用trancount做一个计数。

使用castle.dynamicproxy

要实现标识了transactioncallhandler的方法实现自动事务,使用castle.dynamicproxy实现bl类的代理

castle.dynamicproxy一般操作

 public class myclass : imyclass
 public void mymethod
 console.writeline;
 public class testintercept : iinterceptor
 public void intercept
 console.writeline;
 invocation.proceed;
 console.writeline;
 var proxygenerate = new proxygenerator;
 testintercept t=new testintercept;
 var pg = proxygenerate.createclassproxy myclass 
 pg.mymethod;
 //输出是
 //before
 //my mehod
 //after

最后实现

 public class transactioninterceptor : iinterceptor
 private readonly ilogger logger;
 public transactioninterceptor
 logger = logmanager.getcurrentclasslogger;
 public void intercept
 methodinfo methodinfo = invocation.methodinvocationtarget;
 if 
 methodinfo = invocation.method;
 transactioncallhandlerattribute transaction =
 methodinfo.getcustomattributes transactioncallhandlerattribute .firstordefault;
 if 
 sugarmanager.begintran;
 sugarmanager.trancountaddone;
 invocation.proceed;
 sugarmanager.trancountmunisone;
 sugarmanager.committran;
 catch 
 sugarmanager.rollbacktran;
 logger.error;
 throw e;
 else
 invocation.proceed;
 [attributeusage]
 public class transactioncallhandlerattribute : attribute
 public transactioncallhandlerattribute

autofac与castle.dynamicproxy结合使用

创建代理的时候一个bl类就要一次操作

 proxygenerate.createclassproxy myclass 

而且项目里bl类的实例化是交给ioc容器控制的,我用的是autofac。当然autofac和castle.dynamicproxy是可以结合使用的

using system.reflection;
using autofac;
using autofac.extras.dynamicproxy;
using module = autofac.module;
public class businessmodule : module
 protected override void load
 var business = assembly.load;
 builder.registerassemblytypes
 .asimplementedinterfaces.interceptedby).enableinterfaceinterceptors;
 builder.registertype transactioninterceptor 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

服务热线
在线咨询