伽然官网|AnyForWeb官网|CtrlCRM官网 博客分享:WEB技术|WEB前端|WEB视觉

在.NET里轻松实现AOP

2014-07-01浏览:
标签AOP

MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现,时常在工作学习中遇到AOP,对于它的运用可以说是很熟练了,就是没想过如果自己来实现该如何做,其实主要问题就是卡在了怎么能拦截用户调用,如果可以解决了这个问题AOP的实现也就引刃而解了。

 

首先介绍一下实现了IContextAttribute类型的标识上下文对象之后如何进行抽象,其实也就是对AOP中关注点的抽象:

 

using System.Runtime.Remoting;

using System.Runtime.Remoting.Contexts;

using System.Runtime.Remoting.Activation;

 

namespace FrameWork.AOP.Achieve.AOPBasics

{

   [AttributeUsage(AttributeTargets.Class)]

   public abstract class AOPAttribute : Attribute, IContextAttribute

    {

       public AOPAttribute() { }

       public abstract AOPProperty CreateContextProperty();

 

       public void GetPropertiesForNewContext(IConstructionCallMessage msg)

       {

           AOPProperty contextProperty = CreateContextProperty();

           msg.ContextProperties.Add(contextProperty);

       }

 

       public bool IsContextOK(Context ctx, IConstructionCallMessage msg)

       {

           return false;

       }

    }

}

 

把需要添加的到切面中的属性(上下文属性)的实现是通过CreateContextProperty()方法来实现的,并且CreateContextProperty()方法定义为抽象的由实现类来提供具体的实现,这样做的好处可以让实现更加的灵活添置更多的可扩展点。

 

如果在上面小节中,我们对一个完成的执行过程进行了横切,把日志、性能监测等关注点分离出原执行过程,然而在日志这个关注点中,可能会存在普通日志、性能日志、错误日志等,对于关注点的抽象和关注点的抽象可以很好的解决这一点,也就是对关注点再次的抽象,下面我们看一下关注点属性的代码定义:

 

using System.Runtime.Remoting.Contexts;

using System.Runtime.Remoting.Activation;

using System.Runtime.Remoting.Messaging;

 

namespace FrameWork.AOP.Achieve.AOPBasics

{

   public abstract class AOPProperty : IContextProperty,IContributeServerContextSink

    {

       public AOPProperty() { }

       public void Freeze(Context newContext)

       {

            

       }

 

       public bool IsNewContextOK(Context newCtx)

       {

           return true;

       }

 

       public string Name

       {

           get { return GetName(); }

       }

 

       protected virtual string GetName()

       {

           return "AOP";

       }

 

       protected abstract IMessageSink CreateAOPAspect(IMessageSink nextSink);

 

       public IMessageSink GetServerContextSink(IMessageSink nextSink)

       {

           AOPAspect aopAspect = CreateAOPAspect(nextSink) as AOPAspect;

           aopAspect.AOPPropertyName =Name;

           return (IMessageSink)aopAspect;

       }

    }

}

 

接着,我们将具体关注点执行类型(并不是最终执行的地方)的生成同样是放到了实现具体关注点中的实现了,并且把抽象具体关注点的Name属性值设置为GetName()GetName()方法的定义也是可以由实现具体关注点来定义。下面我们再来看一下具体关注点执行类型的定义:

 

using System.Runtime.Remoting.Contexts;

using System.Runtime.Remoting.Messaging;

using FrameWork.AOP.Achieve.Config;

 

namespace FrameWork.AOP.Achieve.AOPBasics

{

   public abstract class AOPAspect : IMessageSink

    {

       private IMessageSink _NextSink;

 

       private string _AOPPropertyName;

 

       public string AOPPropertyName

       {

           get { return _AOPPropertyName; }

           set { _AOPPropertyName = value; }

       }

 

       public AOPAspect(IMessageSink nextsink)

       {

           _NextSink = nextsink;

       }

 

       public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSinkreplySink)

       {

           return null;

       }

 

       public IMessageSink NextSink

       {

           get { return _NextSink; }

       }

 

       public IMessage SyncProcessMessage(IMessage msg)

       {

           IMethodCallMessage callmsg = msg as IMethodCallMessage;

           if (callmsg == null)

           {

                return null;

           }

           IMessage resultMsg = null;

           BeforeAchieve();

           resultMsg = _NextSink.SyncProcessMessage(msg);

           AfterAchieve();

           return resultMsg;

       }

 

       protected virtual void BeforeAchieve()

       {

 

       }

 

       protected virtual voidAfterAchieve ()

       {

 

       }

    }

}

 

从中可以看到具体关注点执行类型的定义,并且把真正的执行包含在了具体关注点执行类型中(真正的执行是指拦截后的具体操作BeforeAchieveAfterAchieve方法),这个是不妥的。

 

本文为Anyforweb技术分享博客,需要了解网站建设及更多web应用相关信息,请访问anyforweb.com



标签



订阅

欢迎订阅《AnyForWeb 程序开发》
博客


热门文章



AnyForWeb 内部博客分享

版权所有 © 2000- AnyForWeb

Oh~What’s up?

您当前访问的网站已关闭!

如需了解Web行业资讯,请进入:

如需了解Web行业资讯,请进入:伽然书院