netcore中怎么利用transitional自定义注解事物-mile米乐体育

本篇文章给大家分享的是有关netcore中怎么利用transitional自定义注解事物,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

之前实现了netcore实现自定义ioc容器注入,在controller使用事物的过程中思考是否能够像spring一样通过自定义注解实现事物管理,思路图如下

事物的动作拆分只需要根据当前执行线程划分connection对象并开启事物即可,重点是在emit代码织入过程中对异常捕捉的处理

处理过程中主要会用到beginexceptionblock开启try代码块,begincatchblock开启catch代码块,endexceptionblock结束异常捕捉代码块

创建事物注解transitional用来标记controller中需要事物执行的方法

[attributeusage(attributetargets.method)] publicclasstransitional:system.attribute { publicboolautorollback{set;get;}  publictransitional() { autorollback=true; } }

emit编织时需要注意异常捕捉时有返回值时建立全局变量返回,执行事物管理器类的静态方法直接使用call,例如ilofmethod.emit(opcodes.call, typeof(transitionmanage).getmethod("dorollback")),同时controller被拦截的方法需要标记transitional注解且同时是虚方法

被代理类示例

publicclasstransitionalmovie{ [transitional]publicvirtualvoidtest1(){ console.writeline("test1");  }  [transitional]publicvirtualstringtest2(){ console.writeline("test2");thrownewexception("111");return"hello"; }  [transitional(autorollback=false)]publicvirtualvoidtest3(stringkey){ console.writeline("test3"); console.writeline(key);  }

ioc使用示例,ioc容器原理可参考c#通过emit方式实现动态代理

varcontainer=newcontainerbuilder(); container.registertype().enableintercept(); container.build(); transitionalmovietm=container.resolve(); tm.test1();stringresult=tm.test2(); console.writeline(result); tm.test3("世界第一等");

动态代理生成类反编译代码

动态代理包含异常拦截与事物的全部代码

publicstaticobjectcreateproxyobject(typeinterfacetype,typeimptype,typeintercepttype,boolinheritmode=true,boolisinterceptallmethod=true){stringnameofassembly=imptype.name "proxyassembly";stringnameofmodule=imptype.name "proxymodule";stringnameoftype=imptype.name "proxy";varassemblyname=newassemblyname(nameofassembly); modulebuildermodulebuilder=null;varassembly=assemblybuilder.definedynamicassembly(assemblyname,assemblybuilderaccess.run); modulebuilder=assembly.definedynamicmodule(nameofmodule); typebuildertypebuilder;if(inheritmode) { typebuilder=modulebuilder.definetype( nameoftype,typeattributes.public,imptype); }else{ typebuilder=modulebuilder.definetype( nameoftype,typeattributes.public,null,new[]{interfacetype}); }  injectinterceptor(typebuilder,imptype,intercepttype,inheritmode,isinterceptallmethod);vart=typebuilder.createtype();returnactivator.createinstance(t); }privatestaticvoidinjectinterceptor(typebuildertypebuilder,typeimptype,typeintercepttype,boolinheritmode,boolisinterceptallmethod){#region变量定义//----变量定义----varconstructorbuilder=typebuilder.defineconstructor( methodattributes.public,callingconventions.standard,null);varilofctor=constructorbuilder.getilgenerator();//----拦截类对象定义----if(intercepttype==null) { intercepttype=typeof(defaultintercept); }//声明varfieldinterceptor=typebuilder.definefield("_interceptor",intercepttype,fieldattributes.private);//赋值ilofctor.emit(opcodes.ldarg_0); ilofctor.emit(opcodes.newobj,intercepttype.getconstructor(newtype[0])); ilofctor.emit(opcodes.stfld,fieldinterceptor);#endregion#region代理对象定义//----实现类对象定义----//声明varfieldbeproxy=typebuilder.definefield("_beproxy",imptype,fieldattributes.private);//赋值ilofctor.emit(opcodes.ldarg_0); ilofctor.emit(opcodes.newobj,imptype.getconstructor(newtype[0])); ilofctor.emit(opcodes.stfld,fieldbeproxy); ilofctor.emit(opcodes.ret);#endregion//----定义类中的方法----varmethodsoftype=imptype.getmethods(bindingflags.public|bindingflags.instance).where(a=>a.isvirtual).toarray();string[]ignoremethodname=new[]{"gettype","tostring","gethashcode","equals"};for(vari=0;ip.parametertype).toarray();//----定义方法名与参数----varmethodbuilder=typebuilder.definemethod( method.name, methodattributes.public|methodattributes.virtual, callingconventions.standard, method.returntype, methodparametertypes);//如果是泛型方法if(method.isgenericmethod) {//获取所有泛型参数类型定义type[]args=method.getgenericarguments(); listgenericargnames=newlist();for(intj=0;j

以上就是netcore中怎么利用transitional自定义注解事物,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图