AOP(Aspect Oriented Programming)是面向切面编程,用来在不修改代码的情况下,动态的添加功能,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。比较常见的场景是:日志记录,错误捕获、性能监控等。本文主介绍.NET Remoting实现AOP方法,以及相关的示例代码。

1、.NET Remoting简介

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销。.NET Remoting是微软随.NET推出的一种分布式应用解决方案,管理应用程序域之间的 RPC,它允许不同应用程序域之间进行通信,通信可以是在同一个进程中进行、一个系统的不同进程间进行、不同系统的进程间进行。.NET Remoting框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。简单理解也就是客户端可以远程调用服务端的对象方法。

2、使用静态代理实现AOP

使用面向对象的方式实现AOP,代码如下,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    //一般每个接口或类都写在单独的.cs文件中
    //本示例为了执行查看方便才写在一起
    public class User class User
    {
        public string UserName { get; set; }
        public string PassWord { get; set; }
    }
    public interface IUserProcessor
    {
        void RegUser(User user);
    }
    public class UserProcessor : IUserProcessor
    {
        public void RegUser(User user)
        {
            Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord);
        }
    }
    //通过定义一个装饰器类实现
    public class UserProcessorDecorator : IUserProcessor
    {
        public IUserProcessor UserProcessor { get; set; }
        public UserProcessorDecorator(IUserProcessor userprocessor)
        {
            UserProcessor = userprocessor;
        }
        public void RegUser(User user)
        {
            PreProceed(user);
            UserProcessor.RegUser(user);
            PostProceed(user);
        }
        public void PreProceed(User user)
        {
            Console.WriteLine(" 方法执行前 ");
        }
        public void PostProceed(User user)
        {
            Console.WriteLine(" 方法执行后 ");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User() { UserName = "cjavapy", PassWord = "123456" };
            IUserProcessor userprocessor = new UserProcessorDecorator(new UserProcessor());
            userprocessor.RegUser(user);
            Console.ReadKey();
        }
    }
}

3、使用.NET Remoting/RealProxy实现AOP

使用TransparentProxyRealProxy实现对象的代理,代码如下,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
namespace ConsoleApplication
{
    //一般每个接口或类都写在单独的.cs文件中
    //本示例为了执行查看方便才写在一起
    public class User
    {
        public string UserName { get; set; }
        public string PassWord { get; set; }
    }
    public interface IUserProcessor
    {
        void RegUser(User user);
    }
    public class UserProcessor : MarshalByRefObject, IUserProcessor
    {
        public void RegUser(User user)
        {
            Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord);
        }
    }
     // RealProxy
    public class MyRealProxy<T> : RealProxy
    {
        private T _target;
        public MyRealProxy(T target) : base(typeof(T))
        {
            this._target = target;
        }
        public override IMessage Invoke(IMessage msg)
        {
            PreProceede(msg);
            IMethodCallMessage callMessage = (IMethodCallMessage)msg;
            object returnValue = callMessage.MethodBase.Invoke(this._target, callMessage.Args);
            PostProceede(msg);
            return new ReturnMessage(returnValue, new object[0], 0, null, callMessage);
        }
        public void PreProceede(IMessage msg)
        {
            Console.WriteLine(" 方法执行前 ");
        }
        public void PostProceede(IMessage msg)
        {
            Console.WriteLine(" 方法执行后 ");
        }
    }
    // TransparentProxy
    public static class TransparentProxy
    {
        public static T Create<T>()
        {
            T instance = Activator.CreateInstance<T>();
            MyRealProxy<T> realProxy = new MyRealProxy<T>(instance);
            T transparentProxy = (T)realProxy.GetTransparentProxy();
            return transparentProxy;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User() { UserName = "cjavapy", PassWord = "123456" };
            IUserProcessor userprocessor = TransparentProxy.Create<UserProcessor>();
            userprocessor.RegUser(user);
            Console.ReadKey();
        }
    }
}

推荐文档