netcore中怎么利用transitional自定义注解事物-mile米乐体育
开发技术
2021年07月29日 22:00
3
本篇文章给大家分享的是有关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(); list genericargnames=newlist ();for(intj=0;j 以上就是netcore中怎么利用transitional自定义注解事物,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。
展开全文