Unity 依赖注入容器的AOP扩展

使用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 }
View Code

业务层

 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     */
View Code

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 特性
View Code

特性对应的行为

 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 特性对应的行为
View Code

跟踪程序执行过程会发现 程序执行顺序:记录日志=>业务方法=>完成日志=>异常检测

这里程序执行的顺序类似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

猜你喜欢

转载自www.cnblogs.com/Dewumu/p/11772733.html