.NET 通过 Autofac 和 DynamicProxy 实现AOP
来源:互联网 发布:比思论坛2017最新域名 编辑:程序博客网 时间:2024/05/20 13:11
什么是AOP?引用百度百科:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。实现AOP主要由两种方式,一种是编译时静态植入,优点是效率高,缺点是缺乏灵活性,.net下postsharp为代表者(这个是收费的)。另一种方式是动态代理,优缺点与前者相反,动态为目标类型创建代理,通过代理调用实现拦截。AOP能做什么,常见的用例是事务处理、日志记录等等。下面就讲讲Autofac怎么实现AOP,Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP简直是如虎添翼。Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为Autofac.Extras.DynamicProxy,顾名思义,其实现方式为动态代理。
使用前的准备:
通过Nuge安装程序包 :Autofac、Autofac.Extras.DynamicProxy,安装成功之后会增加三个引用
下面正式开始了!
第一步:创建拦截器
下面是一个简单的拦截器示例,该拦截器的功能是显示被拦截的方法名称、参数列表和返回结果
1 /// <summary> 2 /// 拦截器 需要实现 IInterceptor接口 Intercept方法 3 /// </summary> 4 public class CallLogger: IInterceptor 5 { 6 TextWriter _output; 7 8 public CallLogger(TextWriter output) 9 {10 _output = output;11 }12 13 /// <summary>14 /// 拦截方法 打印被拦截的方法执行前的名称、参数和方法执行后的 返回结果15 /// </summary>16 /// <param name="invocation">包含被拦截方法的信息</param>17 public void Intercept(IInvocation invocation)18 {19 20 _output.WriteLine("你正在调用方法 \"{0}\" 参数是 {1}... ",21 invocation.Method.Name,22 string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));23 24 //在被拦截的方法执行完毕后 继续执行25 invocation.Proceed();26 27 _output.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);28 }29 }
第二步:注册拦截器到Autofac容器
拦截器必须注册到Aufofac容器中,可以通过拦截器类型或者命名注入,这两种方式会让使用拦截器的方法有所不同(后面会讲到)。
1 // 命名注入2 builder.Register(c => new CallLogger(Console.Out))3 .Named<IInterceptor>("log-calls");4 5 // 类型注入6 builder.Register(c => new CallLogger(Console.Out));
第三步:启用拦截器
启用拦截器主要有两个方法:EnableInterfaceInterceptors(),EnableClassInterceptors()。
EnableInterfaceInterceptors方法会动态创建一个接口代理
EnableClassInterceptors方法会创建一个目标类的子类代理类,这里需要注意的是只会拦截虚方法,重写方法
启用拦截器示例代码:
//启用类代理拦截 builder.RegisterType<Circle>().EnableClassInterceptors(); //启用接口代理拦截 builder.RegisterType<Circle>().EnableInterfaceInterceptors();
第四步:指明要拦截的类型
有两种方法:
第一种:给类型加上特性Attribute
第二种:在注册类型到容器的时候动态注入拦截器
1 //动态注入拦截器CallLogger2 builder.RegisterType<Circle>().InterceptedBy(typeof(CallLogger)).EnableClassInterceptors();
第五步:测试效果了
1.类代理拦截
Circle类代码:
2.接口代理拦截
IShape接口代码:
1 public interface IShape2 {3 /// <summary>4 /// 形状的面积5 /// </summary>6 void Area();7 8 }
Circle类代码:
1 public class Circle:IShape2 {3 //重写父类抽象方法4 public void Area()5 {6 Console.WriteLine("你正在调用圆求面积的方法");7 }8 }
如果有什么地方写得不对欢迎批评改正,如果有什么疑问,欢迎提问。
阅读全文
0 0
- .NET 通过 Autofac 和 DynamicProxy 实现AOP
- Castle学习系列(十二)---Windsor和DynamicProxy实现AOP
- AOP:PostSharp和Castle DynamicProxy
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
- Autofac+Castle实现AOP事务
- [AOP系列]Autofac+Castle实现AOP事务
- 循序渐进学习Castle.DynamicProxy AOP
- .NET 使用Autofac实现依赖注入
- .NET中通过代理实现面向方面编程(AOP)
- ASP.NET MVC 通过ActionFilter 实现AOP设计 示例
- 通过代理实现AOP
- 通过Unity实现 AOP
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- .net core 集成 autofac
- Castle.DynamicProxy实现WCF接口服务端模拟
- 框架学习与探究之AOP--Castle DynamicProxy
- 通过Annotation来实现AOP
- Swift通过协议实现AOP
- 稀疏矩阵转置
- C++中类对象的内存布局和占用空间
- 究竟能菜到什么程度?—SSH(2)
- 如何解决机器学习中的数据不平衡问题
- 算法谜题12 平铺多米诺问题
- .NET 通过 Autofac 和 DynamicProxy 实现AOP
- POJ1065-Wooden Sticks
- CSS兼容性(IE和Firefox)技巧大全
- springmvc 获取根路径
- 55. Jump Game
- Apache与Tomcat 区别联系
- 高性能mysql笔记(五)加快alter table的速度
- linux文件IO
- 【Java学习20170521】JavaScript复习