来自 美高梅4858官方网站 2019-10-22 12:56 的文章
当前位置: 美高梅4858官方网站 > 美高梅4858官方网站 > 正文

NET项目中使用PostSharp

PostSharp是风流洒脱种Aspect Oriented Programming 面向切面(或面向方面)的零件框架,适用在.NET开拓中,本篇首要介绍Postsharp在.NET开采中的相关文化,以至一些如日志、缓存、事务管理、非常管理等常用的切面管理操作。

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.sharpcrafters.com。近些日子流行版本为4.X,可是是收取费用的AOP软件。

PostSharp使用静态织入格局实现AOP,其连接点特别丰裕,使用简易,何况相对其余一些.NET平台上的AOP框架来讲,PostSharp较为轻量级,可是效果却一点也不差。

完整来说,使用PostSharp,将会推动如下优点:

  • 横切关怀点单独分离出来,进步了代码的清晰性和可维护性。
  • 若是在Aspect中编辑扶植性作用代码,在一定水平上收缩了职业量和冗余代码。

本来,使用PostSharp也会设有有的败笔,首要短处有如下两地点:

  • 追加了调治将养的难度。
  • 对照于不用AOP的代码,运营效用具有减退。

可是白璧微瑕,绝对于那一个毛病难点,使用PostSharp能够不小加强支付成效,裁减重复代码,进而提升代码的可读性、可维护性。

此外在GitHub上还有风流倜傥对开源的AOP组件,比如排头位的是KingAOP(

dynamic helloWorld = new HelloWorld();
helloWorld.HelloWorldCall();

据此即便相比较有利,并且可以称作和PostSharp使用习于旧贯周边,然而改动了指标的创造方式,对日常项目标类对象管理并不太相符。因而笔者依旧非常赞成于接纳PostSharp来拓宽AOP的编程开荒。

 

2、Post夏普框架的接纳

1)希图PostSharp的编写翻译碰到

PostSharp如今版本是4.x,小编在官方网站下载了拓宽利用,不过日常发生"Error connecting to the pipe server. See previous warnings for details.",后来差不离使用了3.x版本的,反而可以健康使用,特别科学,呵呵。

PostSharp是七个可以安装在VS上的插件,安装后在VS的菜单栏目之中扩充了三个PostSharp的菜单项,如下所示。

图片 1

平日品种只要急需动用PostSharp脾性的,在项目性质的【PostSharp】选项页中,使用【Add PostSharp to this project】把PostSharp参与到品种里面举行利用。

图片 2

 增添后,会弹出PostSharp的插件提醒对话框,提醒将参加相应的PostSharp包等内容,如下所示。

图片 3

图片 4

达成后就可以在项目中利用Post夏普的连锁类了。

 

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 DivideByZeroException("A Math Error Occured...");
        }

        [Log, Timing]
        static void LongRunningCalc()
        {
            //wait for 1000 miliseconds
            Thread.Sleep(1000);
        }

从上边大家能够看见,常规的那几个管理、日志管理都早就因此Attribute的办法张开始拍片卖了,在函数体里面都只是多余具体的事情逻辑代码了,那样宏大进步了代码的可读性,简洁明了。

运转方面包车型大巴代码函数的调用,大家能够在输出日志里面看见实际的结果内容。

Entering [ Void Calc() ] ...
“System.DivideByZeroException”类型的第一次机会异常在 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

诸有此类,通过证明的章程,就落到实处了健康日志 、分外的拍卖,当然实际项目上选用日志、非凡管理的那些代码鲜明会越来越头晕目眩一些,不过小例子已经贯彻了断面逻辑的分开管理了,尘归尘、土归土,意气风发切都以那么的简短安静了。

 

本文由美高梅4858官方网站发布于美高梅4858官方网站,转载请注明出处:NET项目中使用PostSharp

关键词: