1. 程式人生 > 其它 >autofac通過aop對方法執行前後進行攔截(.net core)

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()