使用前的准备:
通过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 //动态注入拦截器CallLogger 2 builder.RegisterType<Circle>().InterceptedBy(typeof(CallLogger)).EnableClassInterceptors();
第五步:测试效果了
1.类代理拦截
Circle类代码:
2.接口代理拦截
IShape接口代码:
1 public interface IShape 2 { 3 /// <summary> 4 /// 形状的面积 5 /// </summary> 6 void Area(); 7 8 }
Circle类代码:
1 public class Circle:IShape 2 { 3 //重写父类抽象方法 4 public void Area() 5 { 6 Console.WriteLine("你正在调用圆求面积的方法"); 7 } 8 }
如果有什么地方写得不对欢迎批评改正,如果有什么疑问,欢迎提问。