在 Autofac 中注册事件

Registering Event In Autofac

我认为 IComponentRegistry 接口中只有 Registered 事件实现。我想知道的是:有什么方法可以在注册时间时拦截每个注册以向其添加其他功能。 例如 Registering 事件?

比如我有一个接口IApplicationService。这是一个标记接口,以常规方式注册所有ApplicationServices。该接口将允许我在使用 DDD 方法设计的层中注册所有 ApplicationServices。所以,我想将 UnitOfWork 作为默认值 应用于 Registration[ 上的所有 ApplicationServices =31=] 拦截它们并用 UnitOfWorkInterceptor 装饰它们。这种方法导致,我需要一个 Registering 事件来应用任何 As<>InterceptedBy<> 方法来将组件注册为附录。

我想这意味着在注册时间更新组件。我如何用这种方法处理我的注册?

你可以实现一个 Autofac 模块,它有一个 AttachToComponentRegistration 方法,每次注册都会触发

public class XModule : Module
{
    protected override void AttachToComponentRegistration(
        IComponentRegistry componentRegistry, IComponentRegistration registration)
    { 
        // do whatever you want with registration
    }
}

每次注册都会触发 AttachToComponentRegistration:过去和将来。

Autofac.Extras.DynamicProxy2 扩展适用于 RegistrationBuilder,而 Module 适用于 Registration。 AFAIK 没有办法拦截 IRegistrationBuilder 并自动调用它的方法,因此没有简单的方法可以在 Module 上使用 InterceptedBy 等方法。

顺便说一句,你可以使用经典的 Castle.Core 拦截而不依赖 Autofac.Extras.DynamicProxy2 ,像这样:

public class XModule : Module
{
    public XModule()
    {
        this._generator = new ProxyGenerator();
    }

    private readonly ProxyGenerator _generator;

    protected override void AttachToComponentRegistration(
        IComponentRegistry componentRegistry, 
        IComponentRegistration registration)
    {
        if (registration.Services
                        .OfType<IServiceWithType>()
                        .Any(s => s.ServiceType == typeof(IApplicationService)))
        {
            registration.Activating += Registration_Activating;
        }
    }

    private void Registration_Activating(Object sender, ActivatingEventArgs<Object> e)
    {
        Object proxy = this._generator.CreateClassProxyWithTarget(
            e.Instance.GetType(),
            e.Instance,
            e.Context.Resolve<IEnumerable<IInterceptor>>().ToArray());

        e.ReplaceInstance(proxy);
    }
}

您可以浏览 Autofac.Extras.DynamicProxy2 模块的 source code 以了解如何将 Castle.CoreAutofac 集成.