使用EntLib\PIAB Unity 实现动态代理
1 using System; 2 using Unity; 3 using Unity.Interception; 4 using Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception; 5 using Unity.Interception.PolicyInjection.Pipeline; 6 using Unity.Interception.PolicyInjection.Policies; 7 namespace FrameworkConsole 8 { 9 public class UnityAOP 10 { 11 public static void Show() 12 { 13 IUnityContainer container = new UnityContainer();//声明一个容器 14 container.RegisterType<IBusiness, Business>();//注册IBusiness 15 IBusiness bus = container.Resolve<IBusiness>();//获取 IBusiness 对象 16 bus.DoSomething();//调用 17 18 Console.WriteLine("********************"); 19 container.AddNewExtension<Interception>(); 20 container.RegisterType<IBusiness, Business>()//注册IBusiness 21 .Configure<Interception>()//配置拦截 22 .SetInterceptorFor<IBusiness>(new InterfaceInterceptor());//设置拦截器 23 bus = container.Resolve<IBusiness>();//重新获取 IBusiness 对象 24 bus.DoSomething();//调用 25 Console.Read(); 26 } 27 28 } 29 }
业务层
1 #region 业务 2 [ExceptionHandlerAttribute(Order = 3)] 3 [LogHandlerAttribute(Order = 2)] 4 [AfterLogHandlerAttribute(Order = 5)] 5 public interface IBusiness 6 { 7 void DoSomething(); 8 } 9 10 public class Business : IBusiness 11 { 12 public void DoSomething() 13 { 14 Console.WriteLine("DoSomething"); 15 } 16 } 17 #endregion 业务 18 /* 19 20 InterfaceInterceptor:在接口的方法上进行标记,这样继承这个接口的类里实现这个接口方法的方法就能被拦截 21 */
Unity 扩展特性
1 #region 特性 2 3 public class LogHandlerAttribute : HandlerAttribute 4 { 5 public override ICallHandler CreateHandler(IUnityContainer container) 6 { 7 return new LogHandler() { Order = this.Order }; 8 } 9 } 10 11 public class ExceptionHandlerAttribute : HandlerAttribute 12 { 13 public override ICallHandler CreateHandler(IUnityContainer container) 14 { 15 return new ExceptionHandler() { Order = this.Order }; 16 } 17 } 18 19 public class AfterLogHandlerAttribute : HandlerAttribute 20 { 21 public override ICallHandler CreateHandler(IUnityContainer container) 22 { 23 return new AfterLogHandler() { Order = this.Order }; 24 } 25 } 26 #endregion 特性
特性对应的行为
1 #region 特性对应的行为 2 3 public class LogHandler : ICallHandler 4 { 5 public int Order { get; set; } 6 /// <summary> 7 /// 8 /// </summary> 9 /// <param name="input">方法调用的参数列表</param> 10 /// <param name="getNext"></param> 11 /// <returns></returns> 12 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 13 { 14 Console.WriteLine("日志已记录,Message:{0},Ctime:{1}", "logInfo", DateTime.Now); 15 return getNext()(input, getNext);//先记录日志后,执行下一步操作 16 } 17 } 18 19 20 public class ExceptionHandler : ICallHandler 21 { 22 public int Order { get; set; } 23 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 24 { 25 IMethodReturn methodReturn = getNext()(input, getNext);//先执行下一步操作,再回来校验执行结果是否发生异常 26 if (methodReturn.Exception == null) 27 { 28 Console.WriteLine("无异常"); 29 } 30 else 31 { 32 Console.WriteLine($"异常:{methodReturn.Exception.Message}"); 33 } 34 return methodReturn; 35 } 36 } 37 38 public class AfterLogHandler : ICallHandler 39 { 40 public int Order { get; set; } 41 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 42 { 43 IMethodReturn methodReturn = getNext()(input, getNext);//先执行下一步操作,再回来记录完成日志 44 Console.WriteLine("完成日志,Message:{0},Ctime:{1},计算结果{2}", "AfterLog", DateTime.Now, methodReturn.ReturnValue); 45 return methodReturn; 46 } 47 } 48 #endregion 特性对应的行为
跟踪程序执行过程会发现 程序执行顺序:记录日志=>业务方法=>完成日志=>异常检测
这里程序执行的顺序类似MVC管道模型 典型的俄罗斯套娃模式
微软文档:
System.Configuration https://docs.microsoft.com/zh-cn/dotnet/api/system.configuration?view=netframework-4.8
IUnityContainer https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/ee649880%28v%3dpandp.10%29