解決在.net8 WebAPI中 使用AbstractInterceptorAttribute 實現AOP 攔截器

筑基期發表於2024-09-04

在網上找了許多例子 但是放在.net8 就不好使了 比如 在Program 中配置 IInterceptor或者 services.ConfigureDynamicProxy ,網上說的對 但是也不全對

//透過單元測試(MSTest)
//建立IServiceCollection 
IServiceCollection services = new ServiceCollection();

是能呼叫AbstractInterceptorAttribute ,但是 用 WebAPI 就失效,斷點都不進

嘗試了網上大神的方法,發現 透過配置 失敗

//ConfigureDynamicProxy (失敗)
builder.Services.ConfigureDynamicProxy(config =>
{
    config.Interceptors.AddTyped<RedisInterceptorAttribute>();
    config.Interceptors.AddServiced<RedisInterceptorAttribute>();
    config.Interceptors.AddDelegate(async (content, next) =>
    {
        Console.WriteLine("delegate interceptor"); await content.Invoke(next);
    });
    config.Interceptors.AddTyped<RedisInterceptorAttribute>();
});
//Autifac UseServiceProviderFactory (失敗)
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => { 
                containerBuilder.RegisterType<RedisInterceptorAttribute>();
                containerBuilder.RegisterType<RedisDemoLogic>()
               .EnableClassInterceptors()
               .InterceptedBy(typeof(RedisInterceptorAttribute));

});

成功解決方案,使用Aotifac

//在Program 只需要配置這一句就行
builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory());

實現AbstractInterceptorAttribute

    /// <summary>
    /// Json Redis快取 註解
    /// </summary>
    public class RedisInterceptorAttribute : AbstractInterceptorAttribute, IEquatable<RedisInterceptorAttribute>
    { 
          public override async Task Invoke(AspectContext context, AspectDelegate next){
                  //進入方法前 ,判斷是否有快取
                   await context.Invoke(next);
                   //方法結束後新增到快取
          }
    }
    

在使用時 在方法上一定要加virtual !!!

     //一定要加virtual
     [RedisInterceptor("school")]
     public virtual async Task<List<string>> SelectAsync(Guid[] schoolId)
     {
         ///業務
         return new();
     }

完畢 一定要加virtual !!!

QQ群: 929412850 (Byte.Core 框架交流群)
未經作者同意,禁止轉發

相關文章