快速上手
July 19, 2026 · View on GitHub
本页用一个最小可运行示例,带你走通 AspectCore 的完整链路:定义拦截器、把它应用到方法上、用 Microsoft.Extensions.DependencyInjection 接管容器,然后调用服务看到拦截生效。
前置条件
- 一个 .NET 6.0 及以上的项目(控制台程序即可)。
- 已安装
AspectCore.Extensions.DependencyInjection:
dotnet add package AspectCore.Extensions.DependencyInjection
安装说明与选包见安装。
1. 定义一个拦截器
最常见的写法是继承 AbstractInterceptorAttribute,它本身是一个 Attribute,可以直接标注到接口、类或方法上。在 Invoke 中,调用 next(context)(或 context.Invoke(next))把控制权交给下一个环节,前后即是你的切面逻辑:
using System;
using System.Threading.Tasks;
using AspectCore.DynamicProxy;
public class LoggingInterceptorAttribute : AbstractInterceptorAttribute
{
public override async Task Invoke(AspectContext context, AspectDelegate next)
{
Console.WriteLine($"[Before] {context.ImplementationMethod.Name}");
try
{
await next(context);
}
finally
{
Console.WriteLine($"[After] {context.ImplementationMethod.Name}");
}
}
}
2. 定义服务并应用拦截器
把拦截器特性标注到接口方法上。AspectCore 会为 ICustomService 生成接口代理,在调用 Call() 时织入拦截逻辑:
using System;
using AspectCore.DynamicProxy;
public interface ICustomService
{
[LoggingInterceptor]
void Call();
}
public class CustomService : ICustomService
{
public void Call() => Console.WriteLine("service calling...");
}
3. 用 MS.DI 接管容器并运行
注册服务后调用 ConfigureDynamicProxy() 启用动态代理。构建 ServiceProvider 时用 BuildDynamicProxyProvider()(控制台场景最简单),解析到的实例就是已织入的代理:
using AspectCore.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddTransient<ICustomService, CustomService>();
services.ConfigureDynamicProxy();
var provider = services.BuildDynamicProxyProvider();
provider.GetRequiredService<ICustomService>().Call();
运行后输出:
[Before] Call
service calling...
[After] Call
在 ASP.NET Core / 泛型主机中接管容器
Web 应用通常不手动 BuildDynamicProxyProvider(),而是通过 IServiceProviderFactory 让主机接管容器构建。在 Program/CreateHostBuilder 上挂 DynamicProxyServiceProviderFactory,其余保持不变:
using AspectCore.Extensions.DependencyInjection;
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
在 ConfigureServices 中照常注册服务,并调用一次 services.ConfigureDynamicProxy():
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ICustomService, CustomService>();
services.ConfigureDynamicProxy();
}
关于代理能拦截什么
AspectCore 的运行时代理只能织入可重写的成员:
- 接口代理:接口上的成员都可拦截(如上例)。
- 类代理:只拦截非
sealed类的virtual成员;sealed类、静态成员无法拦截。
细节见 DynamicProxy 运行时引擎。