[Solution] AOP原理解析及Castle、Autofac、Unity框架使用


AOP介绍面向切面编程(Aspect Oriented Programming,英文缩写为AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点.常用于:AuthenticationCachingLazy loadingTransactions普通类123456789classPerson : MarshalByRefObject{publicstringSay(){conststringstr ="Person's say is called";Console.WriteLine(str);returnstr;}}代理类12345678910111213141516publicclassProxy : RealProxywhereT :new(){privateobject_obj;publicProxy(objectobj):base(typeof(T)){_obj = obj;}publicoverrideIMessage Invoke(IMessage msg){Console.WriteLine("{0}:Invoke前", DateTime.Now);varret = ((IMethodCallMessage)msg).MethodBase.Invoke(_obj,null);Console.WriteLine("{0}:Invoke后", DateTime.Now);returnnewReturnMessage(ret,null, 0,null,null);}}执行12345678910staticvoidMain(string[] args){varper =newProxy(newPerson()).GetTransparentProxy()asPerson;if(per !=null){varstr = per.Say();Console.WriteLine("返回值:"+ str);}Console.ReadKey();}AOP有动态代理和静态IL织入.本节主要介绍动态代理方式,静态可参考PostSharp.原理:本质是创建继承原来类的代理类.重写虚方法实现AOP功能.只需引用:Install-Package Castle.Core(在Castle的2.5以上版本,已经将 Castle.DynamicProxy2.dll 里有内容,集成到 Castle.Core.dll 中。)Simple Class12345678910111213141516171819publicabstractclassPerson{publicvirtualvoidSayHello(){Console.WriteLine("我是{0}方法","SayHello");}publicvirtualvoidSayName(stringname){Console.WriteLine("我是{0}方法,参数值:{1}","SayName", name);}publicabstractvoidAbstactSayOther();publicvoidSayOther(){Console.WriteLine("我是{0}方法","SayOther");}}interceptor12345678910111213141516171819202122publicclassSimpleInterceptor : StandardInterceptor{protectedoverridevoidPreProceed(IInvocation invocation){Console.WriteLine("拦截器调用方法前,方法名是:{0}。", invocation.Method.Name);}protectedoverridevoidPerformProceed(IInvocation invocation){Console.WriteLine("拦截器开始调用方法,方法名是:{0}。", invocation.Method.Name);varattrs = invocation.MethodInvocationTarget.Attributes.HasFlag(MethodAttributes.Abstract);//过滤abstract方法if(!attrs){base.PerformProceed(invocation);//此处会调用真正的方法 invocation.Proceed();}}protectedoverridevoidPostProceed(IInvocation invocation){Console.WriteLine("拦截器调用方法后,方法名是:{0}。", invocation.Method.Name);}}Main1234567891011121314151617181920212223staticvoidMain(string[] args){vargenerator =newProxyGenerator();//实例化【代理类生成器】varinterceptor =newSimpleInterceptor();//实例化【拦截器】//使用【代理类生成器】创建Person对象,而不是使用new关键字来实例化varperson = generator.CreateClassProxy(interceptor);Console.WriteLine("当前类型:{0},父类型:{1}", person.GetType(), person.GetType().BaseType);Console.WriteLine();person.SayHello();//拦截Console.WriteLine();person.SayName("Never、C");//拦截Console.WriteLine();person.SayOther();//普通方法,无法拦截person.AbstactSayOther();//抽象方法,可以拦截Console.ReadLine();}特性式AOP12345678910111213publicinterfaceIPerson{voidSay();}[Interceptor(typeof(LogInterceptor))]publicclassPerson : IPerson{publicvoidSay(){Console.WriteLine("Person's Say Method is called!");}}123456789publicclassLogInterceptor : IInterceptor{publicvoidIntercept(IInvocation invocation){Console.WriteLine("{0}:拦截{1}方法{2}前,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);invocation.Proceed();Console.WriteLine("{0}:拦截{1}方法{2}后,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);}}1234567891011staticvoidMain(string[] args){using(varcontainer =newWindsorContainer()){container.Register(Component.For());container.Register(Component.For());varperson = container.Resolve();person.Say();}Console.ReadKey();}
非侵入式AOP123456789101112publicinterfaceIPerson{voidSay();}publicclassPerson : IPerson{publicvoidSay(){Console.WriteLine("Person's Say Method is called!");}}123456789101112131415161718192021internalstaticclassLogInterceptorRegistrar{publicstaticvoidInitialize(WindsorContainer container){container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;}privatestaticvoidKernel_ComponentRegistered(stringkey, IHandler handler){handler.ComponentModel.Interceptors.Add(newInterceptorReference(typeof(LogInterceptor)));}}publicclassLogInterceptor : IInterceptor{publicvoidIntercept(IInvocation invocation){Console.WriteLine("{0}:拦截{1}方法{2}前,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);invocation.Proceed();Console.WriteLine("{0}:拦截{1}方法{2}后,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);}}123456789101112staticvoidMain(string[] args){using(varcontainer =newWindsorContainer()){container.Register(Component.For());//先注入拦截器LogInterceptorRegistrar.Initialize(container);container.Register(Component.For());varperson = container.Resolve();person.Say();}Console.ReadKey();}Install-Package Autofac.Aop通过特性标签绑定1234567891011121314151617181920212223classLogInterceptor : IInterceptor{publicvoidIntercept(IInvocation invocation){Console.WriteLine("{0}:拦截{1}方法{2}前,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);invocation.Proceed();Console.WriteLine("{0}:拦截{1}方法{2}后,", DateTime.Now.ToString("O"), invocation.InvocationTarget.GetType().BaseType, invocation.Method.Name);}}publicinterfaceIPerson{voidSay();}[Intercept(typeof(LogInterceptor))]publicclassPerson : IPerson{publicvoidSay(){Console.WriteLine("Person's Say Method is called!");}}启用拦截器执行1234567891011staticvoidMain(string[] args){varbuilder =newContainerBuilder();builder.RegisterType().As().EnableInterfaceInterceptors();builder.RegisterType();using(varcontainer = builder.Build()){container.Resolve().Say();}Console.ReadLine();}或采用非侵入性方法(去掉class上的特性仍可以)1234567891011staticvoidMain(string[] args){varbuilder =newContainerBuilder();builder.RegisterType().As().EnableInterfaceInterceptors().InterceptedBy(typeof(LogInterceptor));builder.RegisterType();using(varcontainer = builder.Build()){container.Resolve().Say();}Console.ReadLine();}  Unity默认提供了三种拦截器:TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。TransparentProxyInterceptor:代理实现基于.NET Remoting技术,它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRefObject。InterfaceInterceptor:只能对一个接口做拦截,好处时只要目标类型实现了指定接口就可以拦截。VirtualMetho免费云主机域名dInterceptor:对virtual函数进行拦截。缺点是如果被拦截类型没有virtual函数则无法拦截,这个时候如果类型实现了某个特定接口可以改用Install-Package Unity.Interception12345678910111213publicclassMyHandler : ICallHandler{publicintOrder {get;set; }//这是ICallHandler的成员,表示执行顺序publicIMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext){Console.WriteLine("方法执行前");//这之前插入方法执行前的处理varretvalue = getNext()(input, getNext);//在这里执行方法//这之后插入方法执行后的处理Console.WriteLine("方法执行后");returnretvalue;}}1234567publicclassMyHandlerAttribute : HandlerAttribute{publicoverrideICallHandler CreateHandler(IUnityContainer container){returnnewMyHandler();//返回MyHandler}}12345678910111213publicinterfaceIPerson{voidSay();}[MyHandler]publicclassPerson : IPerson{publicvirtualvoidSay(){Console.WriteLine("Person's Say Method is called!");}}123456789101112131415161718staticvoidMain(string[] args){using(varcontainer =newUnityContainer()){container.AddNewExtension();//1.TransparentProxyInterceptor//container.Configure().SetInterceptorFor(new TransparentProxyInterceptor());//2.InterfaceInterceptor (使用1,2,3均可,这种侵入性最小)container.Configure().SetInterceptorFor(newInterfaceInterceptor());//3.VirtualMethodInterceptor//container.Configure().SetInterceptorFor(new VirtualMethodInterceptor());container.RegisterType();container.Resolve().Say();}Console.ReadKey();}

相关推荐: linux和bsd间有哪些区别

这篇文章主要介绍“linux和bsd间有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux和bsd间有哪些区别”文章能帮助大家解决问题。 区别:1、linux只是一个系统内核,BSD是完整操作系统。2、L…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/29 19:06
下一篇 01/29 19:06