这是我参与更文挑战的第21天,活动详情查看: 更文挑战
本文主要通过一个最简单的例子大家使用Autofac集成Aop功能。
什么是Aop
新建一个动物类接口,一个实现接口的猫类
public interface IAnimal
{
void Eat();
}
public class Animal:IAnimal
{
public void Eat()
{
Console.WriteLine("吃东西");
}
}
创建一个代理类。通过代理类实现在Eat接口执行前和执行后执行我们自己定义的代码,这就是最简单的Aop。
public class CatProxy:IAnimal
{
private readonly IAnimal _animal;
public CatProxy(IAnimal animal)
{
_animal = animal;
}
public void Eat()
{
Console.WriteLine("吃东西之前");
_animal.Eat();
Console.WriteLine("吃东西之后");
}
}
如何通过AutoFac实现Aop
上面的例子我们已经实现了一个简单的静态的Aop。当我们有10个,100个类需要执行统一的Aop方法时,难道我们也用这种方式吗?对所有的控制器执行时间监控,那就是在执行前记录一个时间,在执行后记录一下时间,俩个时间一减就是执行时间,这样的代码应该是通用的。所以这个时候我们就需要动态Aop。
1、库的引用
通过Nuget下载Autofac.Extras.DynamicProxy,这是Aufofac执行Aop代理的开源库
nuget install Autofac.Extras.DynamicProxy
2、定义一个Aop拦截器
public class AnimalInterceptor:IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("动物吃东西之前");
invocation.Proceed();
Console.WriteLine("动物吃东西之后");
}
}
3、给要使用拦截器的类添加特性标签
[Intercept(typeof(CatInterceptor))]
public class Animal:IAnimal
{
public void Eat()
{
Console.WriteLine("动物正在吃东西");
}
}
4、Autofac注入拦截器
拦截器的注册是第一步
builder.RegisterType<AnimalInterceptor>();//注册拦截器
注册RegisterTypeAninal类并配置拦截器InterceptedBy,最后启用拦截器EnableInterfaceInterceptors
因为是使用接口注册所以启用拦截器方式是 EnableInterfaceInterceptors ,如何是类直接注册,方法为 EnableClassInterceptors
builder.RegisterType<Animal>().As<IAnimal().InterceptedBy(typeof(AnimalInterceptor)).EnableInterfaceInterceptors();
也可以这样注册
builder.RegisterType<Animal>().InterceptedBy(typeof(AnimalInterceptor)).EnableClassInterceptors();
5、测试效果
var container = builder.Build();
var animal = container.Resolve<Animal>();
animal.Eat();
参考
.NET 通过 Autofac 和 DynamicProxy 实现AOP
[Autofac-使用Castle.Core实现AOP(动态代理)](