AOP(Aspect-Oriented Programming)是一种将函数的辅佐性功用与营业逻辑相星散的编程泛型(programming paradigm),其目标是将横切关注点(cross-cutting concerns)星散出来,使得顺序具有更高的模块化特征。AOP是面向方面软件开辟(Aspect-Oriented Software Development)在编码完成层面上的细致表现。
我们晓得,解耦是顺序员编码开辟过程当中一向寻求的,AOP也是为相识耦所降生。引入AOP手艺,能很大程度上简化我们编码,削减复制的代码量,也便于一致保护一致的部份代码,如日记、缓存、事件处置惩罚、异常处置惩罚等常常运用的处置惩罚。
1、AOP框架的引见
1)AOP手艺引见
AOP手艺应用一种称为“横切”的手艺,解剖开封装的对象内部,并将那些影响了多个类的大众行动封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简朴地说,就是将那些与营业无关,却为营业模块所配合挪用的逻辑或义务封装起来,便于削减体系的反复代码,下降模块间的耦合度,并有利于将来的可操纵性和可保护性。AOP代表的是一个横向的关联,假如说“对象”是一个空心的圆柱体,个中封装的是对象的属性和行动;那末面向方面编程的要领,就似乎一把芒刃,将这些空心圆柱体剖开,以取得其内部的音讯。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的能手将这些剖开的切面回复,不留陈迹。
运用“横切”手艺,AOP把软件体系分为两个部份:中心关注点和横切关注点。营业处置惩罚的重要流程是中心关注点,与之关联不大的部份是横切关注点。横切关注点的一个特点是,他们常常发作在中心关注点的多处,而遍地都基础相似。比方权限认证、日记、事件处置惩罚。Aop 的作用在于星散体系中的种种关注点,将中心关注点和横切关注点星散开来。正如Avanade公司的高等计划构架师Adam Magee所说,AOP的中心头脑就是“将应用顺序中的贸易逻辑同对其供应支撑的通用效劳举行星散。”
2)AOP运用场景
AOP用来封装横切关注点,细致可以鄙人面的场景中运用:
Authentication 权限
Caching 缓存
Context passing 内容通报
Error handling 错误处置惩罚
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 纪录跟踪 优化 校准
Performance optimization 机能优化
Persistence 耐久化
Resource pooling 资本池
Synchronization 同步
Transactions 事件
3)PostSharp框架
PostSharp是一个用于在.NET平台上完成AOP的框架,是比较常常运用的一个AOP框架,官方网站为http://www.ki4.cn/。现在最新版本为4.X,然则是收费的AOP软件。
PostSharp运用静态织入体式格局完成AOP,其连接点异常雄厚,运用简朴,而且相对别的一些.NET平台上的AOP框架来讲,PostSharp较为轻量级,然则功用却一点也不减色。
整体来讲,运用PostSharp,将会带来以下长处:
横切关注点零丁星散出来,进步了代码的清楚性和可保护性。
只要在Aspect中编写辅佐性功用代码,在肯定程度上削减了工作量和冗余代码。
固然,运用PostSharp也会存在一些瑕玷,重要瑕玷有以下两方面:
增添了调试的难度。
比拟于不必AOP的代码,运转效力有所下降。
不过白璧微瑕,相对于这些瑕玷题目,运用PostSharp可以极大进步开辟效力,削减反复代码,从而进步代码的可读性、可保护性。
别的在GitHub上另有一些开源的AOP组件,比方排头位的是KingAOP(http://www.ki4.cn/),不过因为它采用了Dynamic的体式格局来完成,如它的组织对象以下所示。
dynamic helloWorld = new HelloWorld(); helloWorld.HelloWorldCall();
因而虽然比较轻易,而且号称和PostSharp运用习气相似,然则改变了对象的建立体式格局,对平常项目标类对象处置惩罚并不太合适。因而我照样比较倾向于运用PostSharp来举行AOP的编程开辟。
2、PostSharp框架的运用
1)预备PostSharp的编译环境
PostSharp现在版本是4.x,我在官网下载了举行运用,不过常常发作"Error connecting to the pipe server. See previous warnings for details.",厥后痛快运用了3.x版本的,反而可以一般运用,异常不错,呵呵。
PostSharp是一个可以装置在VS上的插件,装置后在VS的菜单栏目内里增添了一个PostSharp的菜单项,以下所示。
平常项目假如须要运用PostSharp特征的,在项目属性的【PostSharp】选项页中,运用【Add PostSharp to this project】把PostSharp到场到项目内里举行运用。
增添后,会弹出PostSharp的插件提醒对话框,提醒将到场响应的PostSharp包等内容,以下所示。
完成后就可以在项目中运用PostSharp的相干类了。
2)增添PostSharp的AOP切面处置惩罚
平常商定每一个Aspect类的定名必需为“XXXAttribute”的情势。个中“XXX”就是这个Aspect的名字。PostSharp中供应了雄厚的内置“Base Aspect”以便我们继续,个中这里我们继续“OnMethodBoundaryAspect ”,这个Aspect供应了进入、退出函数等连接点要领。别的,Aspect上必需设置“[Serializable] ”,这与PostSharp内部对Aspect的生命周期治理有关。
日记的Aspect类的代码以下所示。
[Serializable] public class LogAttribute : OnMethodBoundaryAspect { public override void OnEntry(MethodExecutionArgs args) { Console.WriteLine(Environment.NewLine); Console.WriteLine("Entering [ {0} ] ...", args.Method); base.OnEntry(args); } public override void OnExit(MethodExecutionArgs args) { Console.WriteLine("Leaving [ {0} ] ...", args.Method); base.OnExit(args); } }
异常处置惩罚的类代码以下所示。
[Serializable] public class ExceptionAttribute : OnExceptionAspect { public override void OnException(MethodExecutionArgs args) { Console.WriteLine(String.Format("Exception in :[{0}] , Message:[{1}]", args.Method, args.Exception.Message)); args.FlowBehavior = FlowBehavior.Continue; base.OnException(args); } }
计时处置惩罚的Aspect类代码以下所示。
[Serializable] [MulticastAttributeUsage(MulticastTargets.Method)] public class TimingAttribute : PostSharp.Aspects.OnMethodBoundaryAspect { [NonSerialized] Stopwatch _StopWatch; public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args) { _StopWatch = Stopwatch.StartNew(); base.OnEntry(args); } public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args) { Console.WriteLine(string.Format("[{0}] took {1}ms to execute", new StackTrace().GetFrame(1).GetMethod().Name, _StopWatch.ElapsedMilliseconds)); base.OnExit(args); } }
事件处置惩罚的Aspect类代码以下所示。
[Serializable] [AspectTypeDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, typeof(LogAttribute))] public class RunInTransactionAttribute : OnMethodBoundaryAspect { [NonSerialized] TransactionScope TransactionScope; public override void OnEntry(MethodExecutionArgs args) { this.TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew); } public override void OnSuccess(MethodExecutionArgs args) { this.TransactionScope.Complete(); } public override void OnException(MethodExecutionArgs args) { args.FlowBehavior = FlowBehavior.Continue; Transaction.Current.Rollback(); Console.WriteLine("Transaction Was Unsuccessful!"); } public override void OnExit(MethodExecutionArgs args) { this.TransactionScope.Dispose(); } }
下面是几个Aspect类的切面处置惩罚代码,以下所示。
[Exception] [Log] static void Calc() { throw new pideByZeroException("A Math Error Occured..."); } [Log, Timing] static void LongRunningCalc() { //wait for 1000 miliseconds Thread.Sleep(1000); }
从上面我们可以看到,通例的异常处置惩罚、日记处置惩罚都已经由过程Attribute的体式格局举行处置惩罚了,在函数体内里都只是剩下细致的营业逻辑代码了,如许极大进步了代码的可读性,简约明了。
运转上面的代码函数的挪用,我们可以在输出日记内里看到细致的效果内容。
Entering [ Void Calc() ] ... “System.pideByZeroException”范例的第一次时机异常在 PostSharpExample.exe 中发作 Exception in :[Void Calc()] , Message:[A Math Error Occured...] Leaving [ Void Calc() ] ... Entering [ Void LongRunningCalc() ] ... Leaving [ Void LongRunningCalc() ] ... [LongRunningCalc] took 1002ms to execute
如许,经由过程声明的体式格局,就完成了通例日记 、异常的处置惩罚,固然现实项目上运用日记、异常处置惩罚的这些代码肯定会越发庞杂一些,不太小例子已完成了切面逻辑的星散处置惩罚了,尘归尘、土归土,一切都是那末的简约平静了。
以上就是在.NET项目中运用PostSharp的细致内容,更多请关注ki4网别的相干文章!