.Net AOP (四)EnterpriseLibary 实现方法
首先添加EnterpriseLibary的引用
自定义CallHandler,这里定义两个CallHandler分别用于参数检查和日志记录。
using Microsoft.Practices.Unity.InterceptionExtension; public class UserHandler:ICallHandler { public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { User user = input.Inputs[0] as User; if (user.PassWord.Length < 10) { return input.CreateExceptionMethodReturn(new UserException("密码长度不能小于10位")); } Console.WriteLine("参数检测无误"); return getNext()(input, getNext); } } public class LogHandler:ICallHandler { public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { User user = input.Inputs[0] as User; Log log = new Log() { Message = string.Format("RegUser:Username:{0},Password:{1}", user.Name, user.PassWord), Ctime = DateTime.Now }; Console.WriteLine("日志已记录,Message:{0},Ctime:{1}",log.Message,log.Ctime); var messagereturn = getNext()(input, getNext); return messagereturn; } }
using Microsoft.Practices.Unity.InterceptionExtension; using Microsoft.Practices.Unity; public class UserHandlerAttribute : HandlerAttribute { public override ICallHandler CreateHandler(IUnityContainer container) { ICallHandler handler = new UserHandler(){Order=this.Order}; return handler; } } public class LogHandlerAttribute:HandlerAttribute { public int Order { get; set; } public override ICallHandler CreateHandler(IUnityContainer container) { return new LogHandler() { Order = this.Order }; } }
[LogHandlerAttribute(Order=2)] [UserHandlerAttribute(Order=1)] public interface IUserProcessor { void RegUser(User user); } public class UserProcessor : MarshalByRefObject,IUserProcessor { public void RegUser(User user) { Console.WriteLine("用户已注册。"); } }
测试
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection; public class Client { public static void Run() { try { User user = new User() { Name = "lee", PassWord = "123123123123" }; UserProcessor userprocessor = PolicyInjection.Create<UserProcessor>(); userprocessor.RegUser(user); } catch(Exception ex) { throw ex; } } }