.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;
}
}
定义对应的HandlerAttribute
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 };
}
}
用户注册接口和实现,这里通过为接口添加attribute的方式实现。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;
}
}
}