阅读 205

Autofac集成面向切面Aop功能

这是我参与更文挑战的第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(动态代理)](

文章分类
后端
文章标签