Autofac集成面向切面Aop功能

本文最后更新于:2021年9月29日 下午

本文主要通过一个最简单的例子大家使用Autofac集成Aop功能。

什么是Aop

新建一个动物类接口,一个实现接口的猫类

1
2
3
4
5
6
7
8
9
10
11
public interface IAnimal
{
void Eat();
}
public class Animal:IAnimal
{
public void Eat()
{
Console.WriteLine("吃东西");
}
}

创建一个代理类。通过代理类实现在Eat接口执行前和执行后执行我们自己定义的代码,这就是最简单的Aop。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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代理的开源库

1
nuget install  Autofac.Extras.DynamicProxy

2、定义一个Aop拦截器

1
2
3
4
5
6
7
8
9
public class AnimalInterceptor:IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("动物吃东西之前");
invocation.Proceed();
Console.WriteLine("动物吃东西之后");
}
}

3、给要使用拦截器的类添加特性标签

1
2
3
4
5
6
7
8
[Intercept(typeof(CatInterceptor))]
public class Animal:IAnimal
{
public void Eat()
{
Console.WriteLine("动物正在吃东西");
}
}

4、Autofac注入拦截器

拦截器的注册是第一步

1
builder.RegisterType<AnimalInterceptor>();//注册拦截器

注册RegisterTypeAninal类并配置拦截器InterceptedBy,最后启用拦截器EnableInterfaceInterceptors

因为是使用接口注册所以启用拦截器方式是 EnableInterfaceInterceptors ,如何是类直接注册,方法为 EnableClassInterceptors

1
builder.RegisterType<Animal>().As<IAnimal().InterceptedBy(typeof(AnimalInterceptor)).EnableInterfaceInterceptors();

也可以这样注册

1
builder.RegisterType<Animal>().InterceptedBy(typeof(AnimalInterceptor)).EnableClassInterceptors();

5、测试效果

1
2
3
var container = builder.Build();
var animal = container.Resolve<Animal>();
animal.Eat();

参考

.NET 通过 Autofac 和 DynamicProxy 实现AOP

Autofac-使用Castle.Core实现AOP(动态代理)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!