使用.net core中的类DispatchProxy实现AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,经过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是软件开发中的一个热点,利用AOP能够对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度下降,提升程序的可重用性。编程

好比说三层的调用:UI => BLL => DAL,正常来讲咱们会在UI层调用BLL层某个类的某个方法,而后BLL层某个类的某个方法又会调用DAL层某个类的某个方法,能够说一般状况下咱们都是这么干的,AOP能够作到在调用BLL层任意方法以前或以后作一些统一的逻辑处理,若是说UI调BLL、BLL调DAL是纵向的话,那么AOP就是横向的缓存

AOP的典型应用场景:日志记录、权限验证、异常处理、缓存等ide

在.net core中有DispatchProxy类,提供实例化代理对象和处理其方法调度的机制,借助它能够实现AOP,直接看示例spa

 

定义一个消息接口IMessage,其中有一个发送消息Send和接收消息Receive的方法定义:.net

    public interface IMessage
    {
        void Send(string content);
        void Receive(string content);
    }

 

定义电子邮件类EmailMessage实现消息接口IMessage,实现使用电子邮件发送和接收消息:代理

    public class EmailMessage : IMessage
    {
        public void Send(string content)
        {
            Console.WriteLine("Send Email:" + content);
        }
        public void Receive(string content)
        {
            Console.WriteLine("Receive Email:" + content);
        }
    }

 

定义日志拦截器LogDispatchProxy 继承自DispatchProxy类,重写基类Invoke方法并在目标方法调用先后加上所需业务逻辑;而后定义TargetClass属性,该属性是目标方法所属类的实例日志

    public class LogDispatchProxy : DispatchProxy
    {
        public object TargetClass { get; set; }
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            Write("方法执行前");
            var result = targetMethod.Invoke(TargetClass, args);
            Write("方法执行后");
            return result;
        }

        private void Write(string content)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(content);
            Console.ResetColor();
        }
    }

 

使用:code

    class Program
    {
        static void Main(string[] args)
        {
            //使用DispatchProxy类的静态方法Create生成代理类,其中Create是个泛型方法,泛型有两个值,第一个值必须是接口,第二个值必须是DispatchProxy的子类
            IMessage messageDispatchProxy = DispatchProxy.Create<IMessage, LogDispatchProxy>();
            //建立一个实现了IMessage接口的类的实例,并赋值给代理类的TargetClass属性
            ((LogDispatchProxy)messageDispatchProxy).TargetClass = new EmailMessage();
            messageDispatchProxy.Send("早上好");
            messageDispatchProxy.Receive("中午好");

            Console.ReadKey();
        }
    }

个人理解:经过DispatchProxy.Create建立的代理类messageDispatchProxy 就是一个继承自LogDispatchProxy的类,而且利用咱们提供的的实例实现了IMessage接口,因此messageDispatchProxy能够强转为LogDispatchProxy和IMessage对象

 

执行结果blog

至此,咱们没有经过任何第三方类库,本身实现了一个AOP

相关文章
相关标签/搜索