AspectCore 对所有子类都生效

在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 方法,则切面会直接应用到基类的该方法上。

posted @ 2024-06-21 00:21  China Soft  阅读(24)  评论(0编辑  收藏  举报