Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP简直是如虎添翼。Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为Autofac.Extras.DynamicProxy,顾名思义,其实现方式为动态代理。
使用方式比较简单,先新建一个控制台项目,然后在Nuget上搜索Autofac.Aop并安装,如下顺序:
或者通过命令安装:
Install-Package Autofac.Aop
安装成功之后会项目会增加几个个引用,如下图:
1. 创建拦截器
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;//先在Nuget上搜索Autofac.Aop安装
usingCastle.DynamicProxy;namespaceAutofacDEMO
{///
///拦截器 需要实现 IInterceptor接口 Intercept方法///
public classLogInterceptor : IInterceptor
{///
///拦截方法 打印被拦截的方法执行前的名称、参数和方法执行后的 返回结果///
/// 包含被拦截方法的信息
public voidIntercept(IInvocation invocation)
{
Console.WriteLine("方法执行前:拦截{0}类下的方法{1}的参数是{2}",
invocation.InvocationTarget.GetType(),
invocation.Method.Name,string.Join(",", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));//在被拦截的方法执行完毕后 继续执行
invocation.Proceed();
Console.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
Console.WriteLine();
}
}
}
View Code
2. 创建拦截容器
var builder = new ContainerBuilder();
3.注册拦截器到Autofac容器
拦截器必须注册到Aufofac容器中,可以通过拦截器类型或者命名注入,这两种方式会让使用拦截器的方法有所不同
//命名注入
builder.Register(c => new LogInterceptor()).Named("log-calls");//类型注入
builder.Register(c => newLogInterceptor());
//或者
builder.RegisterType();
4. 启用拦截器
启用拦截器主要有两个方法:EnableInterfaceInterceptors(),EnableClassInterceptors()。
EnableInterfaceInterceptors方法会动态创建一个接口代理
EnableClassInterceptors方法会创建一个目标类的子类代理类,这里需要注意的是只会拦截