第三方容器

July 19, 2026 · View on GitHub

如果项目已经在用 Autofac、Castle Windsor 或 LightInject,不必换成 AspectCore 内置容器,也能启用动态代理。每种容器都有一个对应的集成包,提供一行式的注册入口,并接受与其他宿主一致的 Action<IAspectConfiguration> 来配置拦截器。泛型主机(IHostBuilder)另有专门的扩展。

各集成入口共享同一套拦截器配置 API,拦截器的定义与注册方式见拦截器配置

Autofac

包:AspectCore.Extensions.Autofac。在 ContainerBuilder 上调用 RegisterDynamicProxy(...)

using AspectCore.Configuration;
using AspectCore.Extensions.Autofac;
using Autofac;

var containerBuilder = new ContainerBuilder();
// 注册你的服务 ...

containerBuilder.RegisterDynamicProxy(config =>
{
    config.Interceptors.AddTyped<MethodExecuteLoggerInterceptor>(Predicates.ForService("*Service"));
});

var container = containerBuilder.Build();

RegisterDynamicProxy 有两个重载:一个接受可选的 Action<IAspectConfiguration> configure,另一个额外接受一个预先构建的 IAspectConfiguration

// ContainerBuilder RegisterDynamicProxy(this ContainerBuilder, Action<IAspectConfiguration> configure = null)
// ContainerBuilder RegisterDynamicProxy(this ContainerBuilder, IAspectConfiguration configuration, Action<IAspectConfiguration> configure = null)

Castle Windsor

包:AspectCore.Extensions.Windsor。在容器上调用 AddAspectCoreFacility(...)

using AspectCore.Configuration;
using AspectCore.Extensions.Windsor;
using Castle.Windsor;

var container = new WindsorContainer().AddAspectCoreFacility(config =>
{
    config.Interceptors.AddTyped<CustomInterceptorAttribute>();
});

不带参数调用即使用默认配置:

var container = new WindsorContainer().AddAspectCoreFacility();

AddAspectCoreFacility 提供 IWindsorContainerIKernel 两个重载,都接受可选的 Action<IAspectConfiguration> configure;facility 是幂等的,重复添加不会重复注册。

LightInject

包:AspectCore.Extensions.LightInject。在 LightInject 的 IServiceContainer 上调用 RegisterDynamicProxy(...)

using AspectCore.Configuration;
using AspectCore.Extensions.LightInject;
using LightInject;

var container = new ServiceContainer().RegisterDynamicProxy(config =>
{
    config.Interceptors.AddDelegate(
        next => ctx => next(ctx),
        Predicates.ForNameSpace("Your.Namespace"));
});

同样也支持不带配置的调用(container.RegisterDynamicProxy();),以及额外接受预建 IAspectConfiguration 的重载。

泛型主机(Hosting)

包:AspectCore.Extensions.Hosting。它面向 IHostBuilder,把内置容器 IServiceContext 接入主机。

UseServiceContext() 接管容器,并可传入委托做注册与配置:

using AspectCore.DependencyInjection;
using AspectCore.Extensions.Hosting;
using Microsoft.Extensions.Hosting;

hostBuilder.UseServiceContext(container =>
{
    container.AddType<IService, Service>();
    container.Configure(config =>
    {
        config.Interceptors.AddDelegate(async (ctx, next) =>
        {
            await next(ctx);
            ctx.ReturnValue = "proxy";
        });
    });
});

也可以用 UseDynamicProxy() 搭配 ConfigureDynamicProxy(...),在 IServiceCollection 上注册拦截器:

using AspectCore.Configuration;
using AspectCore.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;

hostBuilder
    .UseDynamicProxy()
    .ConfigureDynamicProxy((services, config) =>
    {
        config.Interceptors.AddTyped<CustomInterceptorAttribute>();
    });

UseServiceContext 另有 Action<HostBuilderContext, IServiceContext> 和无参重载;ConfigureDynamicProxy 也有带 HostBuilderContext 的重载。

入口一览

容器入口方法扩展目标
AutofacAspectCore.Extensions.AutofacRegisterDynamicProxy(...)ContainerBuilder
Castle WindsorAspectCore.Extensions.WindsorAddAspectCoreFacility(...)IWindsorContainer / IKernel
LightInjectAspectCore.Extensions.LightInjectRegisterDynamicProxy(...)IServiceContainer
泛型主机AspectCore.Extensions.HostingUseServiceContext() / UseDynamicProxy()IHostBuilder

下一步