.NET中AOP的几种实现方案

本文的例子模拟用户注册的场景,主要通过代码演示几种方案的实现方式。

静态代理

通过装饰模式实现静态代理,大家一看代码基本就明白了。

用户注册接口和实现

  1. public interface IUserProcessor 
  2.     void RegUser(User user); 
  3. public class UserProcessor : IUserProcessor 
  4.     public  void RegUser(User user) 
  5.     { 
  6.         Console.WriteLine("用户已注册。Name:{0},PassWord:{1}", user.Name, user.PassWord); 
  7.     } 

通过静态编写代码的方式,装饰上面的用户注册

  1. public class UserProcessorDecorator:IUserProcessor 
  2.     { 
  3.         public IUserProcessor UserProcessor { get; set; } 
  4.         public UserProcessorDecorator(IUserProcessor userprocessor) 
  5.         { 
  6.             UserProcessor = userprocessor; 
  7.         } 
  8.         public  void RegUser(User user) 
  9.         { 
  10.             PreProceed(user); 
  11.             UserProcessor.RegUser(user); 
  12.             PostProceed(user); 
  13.         } 
  14.         public void PreProceed(User user) 
  15.         { 
  16.             Console.WriteLine("方法执行前"); 
  17.         } 
  18.  
  19.         public void PostProceed(User user) 
  20.         { 
  21.             Console.WriteLine("方法执行后"); 
  22.         } 
  23.     } 

客户端调用

  1. public class Client 
  2.     public static void Run() 
  3.     { 
  4.         try 
  5.         { 
  6.             User user = new User() { Name = "lee", PassWord = "123123123123" }; 
  7.             IUserProcessor userprocessor = new UserProcessorDecorator(new UserProcessor()); 
  8.             userprocessor.RegUser(user); 
  9.         } 
  10.         catch (Exception ex) 
  11.         { 
  12.             throw ex; 
  13.         } 
  14.     } 

输出

方法执行前
用户已注册。Name:lee,PassWord:123123123123
方法执行后

动态代理

1、使用.Net Remoting/RealProxy

采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - RealProxy - Target Object

下面实现自定义的TransparentProxy和RealProxy 

  1. using System.Runtime.Remoting.Proxies; 
  2. using System.Runtime.Remoting.Messaging; 
  3.     //RealProxy 
  4.     public class MyRealProxy<T>:RealProxy 
  5.     { 
  6.         private T _target; 
  7.         public MyRealProxy(T target) : base(typeof(T)) 
  8.         { 
  9.             this._target = target; 
  10.         } 
  11.        public override IMessage Invoke(IMessage msg) 
  12.        { 
  13.             PreProceede(msg); 
  14.             IMethodCallMessage callMessage = (IMethodCallMessage)msg; 
  15.             object returnValue = callMessage.MethodBase.Invoke(this._target, callMessage.Args); 
  16.             PostProceede(msg); 
  17.             return new ReturnMessage(returnValue, new object[0], 0, null, callMessage); 
  18.         } 
  19.        public void PreProceede(IMessage msg) 
  20.        { 
  21.            Console.WriteLine("方法执行前"); 
  22.        } 
  23.        public void PostProceede(IMessage msg) 
  24.        { 
  25.            Console.WriteLine("方法执行后"); 
  26.        } 
  27.     } 
  28.    //TransparentProxy 
  29.    public static class TransparentProxy 
  30.    { 
  31.         public static T Create<T>() 
  32.         { 
  33.            T instance = Activator.CreateInstance<T>(); 
  34.            MyRealProxy<T> realProxy = new MyRealProxy<T>(instance); 
  35.            T transparentProxy = (T)realProxy.GetTransparentProxy(); 
  36.            return transparentProxy; 
  37.         } 
  38.    } 

用户注册接口和实现

  1. public interface IUserProcessor 
  2.   { 
  3.       void RegUser(User user); 
  4.   } 
  5.  
  6.   public class UserProcessor : MarshalByRefObject, IUserProcessor 
  7.   { 
  8.       public void RegUser(User user) 
  9.       { 
  10.           Console.WriteLine("用户已注册。"); 
  11.       } 
  12.   } 

客户端调用

  1. public class Client 
  2.    { 
  3.        public static void Run() 
  4.        { 
  5.            try 
  6.            { 
  7.                User user = new User() { Name = "lee", PassWord = "123123123123" }; 
  8.                UserProcessor userprocessor = TransparentProxy.Create<UserProcessor>(); 
  9.                userprocessor.RegUser(user); 
  10.            } 
  11.            catch (Exception ex) 
  12.            { 
  13.                throw ex; 
  14.            } 
  15.        } 
  16.    } 

输出

方法执行前
用户已注册。Name:lee,PassWord:123123123123
方法执行后

2、使用EntLib\PIAB

自定义CallHandler,这里定义两个CallHandler分别用于参数检查和日志记录。

  1. using Microsoft.Practices.Unity.InterceptionExtension; 
  2.  
  3.  public class UserHandler:ICallHandler 
  4.     { 
  5.         public int Order { get; set; } 
  6.         public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
  7.         { 
  8.             User user = input.Inputs[0] as User; 
  9.             if (user.PassWord.Length < 10) 
  10.             { 
  11.                 return input.CreateExceptionMethodReturn(new UserException("密码长度不能小于10位")); 
  12.             } 
  13.             Console.WriteLine("参数检测无误"); 
  14.             return getNext()(input, getNext); 
  15.         } 
  16.     } 
  17.  
  18.     public class LogHandler:ICallHandler 
  19.     { 
  20.         public int Order { get; set; } 
  21.         public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
  22.         { 
  23.             User user = input.Inputs[0] as User; 
  24.             Log log = new Log() { Message = string.Format("RegUser:Username:{0},Password:{1}", user.Name, user.PassWord), Ctime = DateTime.Now }; 
  25.             Console.WriteLine("日志已记录,Message:{0},Ctime:{1}",log.Message,log.Ctime); 
  26.             var messagereturn  = getNext()(input, getNext);  
  27.             return messagereturn; 
  28.         } 
  29.     } 

定义对应的HandlerAttribute

  1. using Microsoft.Practices.Unity.InterceptionExtension; 
  2. using Microsoft.Practices.Unity; 
  3.  
  4.     public class UserHandlerAttribute : HandlerAttribute 
  5.     { 
  6.         public override ICallHandler CreateHandler(IUnityContainer container) 
  7.         { 
  8.             ICallHandler handler = new UserHandler(){Order=this.Order}; 
  9.             return handler; 
  10.         } 
  11.     } 
  12.  
  13.     public  class LogHandlerAttribute:HandlerAttribute 
  14.     { 
  15.         public int Order { get; set; } 
  16.         public override ICallHandler CreateHandler(IUnityContainer container) 
  17.         { 
  18.             return new LogHandler() { Order = this.Order }; 
  19.         } 
  20.     } 

用户注册接口和实现,这里通过为接口添加attribute的方式实现。order值表示执行顺序,值小的先执行。

  1. [LogHandlerAttribute(Order=2)] 
  2. [UserHandlerAttribute(Order=1)] 
  3. public interface IUserProcessor 
  4.      void RegUser(User user); 
  5.  
  6. public class UserProcessor : MarshalByRefObject,IUserProcessor 
  7.     public  void RegUser(User user) 
  8.     { 
  9.         Console.WriteLine("用户已注册。"); 
  10.     } 

客户端调用

  1. using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;  
  2.     
  3.     public class Client 
  4.     { 
  5.         public static void Run() 
  6.         { 
  7.             try 
  8.             { 
  9.                 User user = new User() { Name = "lee", PassWord = "123123123123" }; 
  10.                 UserProcessor userprocessor = PolicyInjection.Create<UserProcessor>(); 
  11.                 userprocessor.RegUser(user); 
  12.             } 
  13.             catch(Exception ex) 
  14.             { 
  15.                 throw ex; 
  16.             } 
  17.         } 
  18.     } 

输出:

参数检测无误
日志已记录,Message:RegUser:Username:lee,Password:123123123123,Ctime:2010-12-22
6:14:59
用户已注册。

3、使用Castle\DynamicProxy

自定义Interceptor

  1. public class MyInterceptor : IInterceptor 
  2.    { 
  3.        public void Intercept(IInvocation invocation) 
  4.        { 
  5.            PreProceed(invocation); 
  6.            invocation.Proceed(); 
  7.            PostProceed(invocation); 
  8.        } 
  9.        public void PreProceed(IInvocation invocation) 
  10.        { 
  11.            Console.WriteLine("方法执行前"); 
  12.        } 
  13.  
  14.        public void PostProceed(IInvocation invocation) 
  15.        { 
  16.            Console.WriteLine("方法执行后"); 
  17.        } 
  18.    } 

用户注册接口和实现

  1. public interface IUserProcessor 
  2.    { 
  3.        void RegUser(User user); 
  4.    } 
  5.  
  6.    public class UserProcessor : IUserProcessor 
  7.    { 
  8.        public virtual void RegUser(User user) 
  9.        { 
  10.            Console.WriteLine("用户已注册。Name:{0},PassWord:{1}", user.Name, user.PassWord); 
  11.        } 
  12.    } 

客户端调用

  1. public class Client 
  2.    { 
  3.        public static void Run() 
  4.        { 
  5.            try 
  6.            { 
  7.                ProxyGenerator generator = new ProxyGenerator(); 
  8.                MyInterceptor interceptor = new MyInterceptor(); 
  9.                UserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor); 
  10.                User user= new User() { Name = "lee", PassWord = "123123123123" }; 
  11.                userprocessor.RegUser(user); 
  12.            } 
  13.            catch (Exception ex) 
  14.            { 
  15.                throw ex; 
  16.            } 
  17.        } 
  18.    } 

输出

方法执行前
用户已注册。Name:lee,PassWord:123123123123
方法执行后

关于上面各方案的详细介绍园子里都有很好的文章,我就不班门弄斧了。

转载于:https://my.oschina.net/dyg540/blog/83181

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值