AspectCore 對所有子類都生效

China Soft發表於2024-06-21

在AspectCore中,要讓切面(Aspect)對所有子類都生效,需要使用DynamicProxy特性,並確保子類也被代理。這通常透過基類(如果有的話)或者介面來實現。

以下是一個簡單的例子,演示如何定義一個切面,並確保它能應用於所有子類:

定義一個介面和一個實現該介面的基類:

public interface IService
{
void DoSomething();
}

public class BaseService : IService
{
public virtual void DoSomething()
{
Console.WriteLine("Doing something...");
}
}

定義切面類:

public class MyAspect : AbstractInterceptorAttribute
{
public override Task Invoke(AspectContext context, AspectDelegate next)
{
Console.WriteLine("Before DoSomething");
var task = next(context); // 呼叫目標方法
task.Wait(); // 如果目標方法是async,則需要等待它完成
Console.WriteLine("After DoSomething");
return Task.CompletedTask;
}
}

配置AspectCore服務:

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient(typeof(IService), typeof(BaseService));
services.ConfigureDynamicProxy(config =>
{
config.Interceptors.AddTyped<MyAspect>(Predicates.ForService("*Service"));
});
}
}

在這個例子中,MyAspect 切面會被應用到所有實現了 IService 介面的類上,因為我們使用了 Predicates.ForService("*Service") 來指定匹配的服務型別。

確保你的應用程式啟動類(Startup類)中的 ConfigureServices 方法被正確呼叫,並且你已經在 Configure 方法中啟用了AspectCore。

子類繼承自基類(BaseService),並且如果子類覆蓋了 DoSomething 方法,切面同樣會被應用到子類的該方法上。如果子類沒有覆蓋 DoSomething 方法,則切面會直接應用到基類的該方法上。

相關文章