这是我参与更文挑战的第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(动态代理)](
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)