5、动态代理AOP实现-DynamicProxy模式

通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能

  1. 定义1个用户接口,里面有个注册用户方法
    public interface IUserProcessor
    {
      void RegUser(User user);
    }
  2. 实现用户这个接口
    public class UserProcessor : IUserProcessor
    {
                /// <summary>
                /// 必须带上virtual 否则无效
                /// </summary>
                /// <param name="user"></param>
                public virtual void RegUser(User user)
                {
                    Console.WriteLine($"用户已注册。Name:{user.Name},PassWord:{user.Password}");
                }
    }
  3. 继承IInterceptor接口,实现IInterceptor接口里的Intercept方法
    public class MyInterceptor : IInterceptor
    {
                public void Intercept(IInvocation invocation)
                {
                    PreProceed(invocation);
                    invocation.Proceed();//就是调用原始业务方法
                    PostProceed(invocation);
                }
    
                public void PreProceed(IInvocation invocation)
                {
                    Console.WriteLine("方法执行前");
                }
    
                public void PostProceed(IInvocation invocation)
                {
                    Console.WriteLine("方法执行后");
                }
    }
  4. 调用

    /// <summary>
    /// 使用Castle\DynamicProxy 实现动态代理
    /// 方法必须是虚方法
    /// </summary>
    public class CastleProxyAOP
    {
            public static void Show()
            {
                User user = new User()
                {
                    Name = "Eleven",
                    Password = "123456"
                };
                ProxyGenerator generator = new ProxyGenerator();
                MyInterceptor interceptor = new MyInterceptor();
                UserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor);
                userprocessor.RegUser(user);
            }
    }

     

posted @ 2019-03-19 15:29  David.Meng  阅读(339)  评论(0编辑  收藏  举报