autofac通过aop对方法执行前后进行拦截(.net core)

.net core中,如果想要在控制器请求前和请求后输出日志,是非常好实现的,直接使用拦截器就能达到目的。但是如果想要对服务层的方法进行拦截该如何实现呢?这里介绍使用autofac的方式实现。如果对autofac的使用不熟悉可以参考:https://www.cnblogs.com/duanjt/p/16246546.html。

引入nuget包

<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />

定义接口类和实现类

// 注意Intercept是核心,CacheInterception表示拦截类,后面会创建该类
[Intercept(typeof(CacheInterception))]
public interface IUsersBLL
{
    public List<Users> GetAll();
}

public class UsersBLL : IUsersBLL
{
    public virtual List<Users> GetAll()
    {
        return new List<Users>()
        {
            new Users(){Name="张三"},
            new Users(){Name="李四"}
        };
    }
}

定义拦截类CacheInterception

/// <summary>
/// 缓存拦截器,必须实现IInterceptor接口
/// </summary>
public class CacheInterception : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("执行前:" + invocation.Method.ReflectedType.FullName);
        invocation.Proceed();//执行
        Console.WriteLine("执行后:" + JsonConvert.SerializeObject(invocation.ReturnValue));
    }
}

最后就是在注入方法ConfigureContainer中修改

public void ConfigureContainer(ContainerBuilder builder)
{
    //EnableInterfaceInterceptors表示启用接口拦截
    builder.RegisterType<UsersBLL>().As<IUsersBLL>().EnableInterfaceInterceptors();
    //将拦截类注入到容器中
    builder.Register(c => new CacheInterception());
}

 

注意

1.UsersBLL中的方法必须是虚方法

2.[Intercept(typeof(CacheInterception))]也有另外一种写法,就是在注入时直接加上builder.RegisterType<UsersBLL>().As<IUsersBLL>().InterceptedBy(typeof(CacheInterception)).EnableInterfaceInterceptors()

 

posted @ 2022-05-08 20:08  段江涛IT  阅读(681)  评论(0编辑  收藏  举报
页脚HTML代码