如何在Autofac中为开放式泛型注册注册开放式泛型装饰器



我在autofac中为处理程序打开了一个通用注册,如下所示。

  builder.RegisterAssemblyTypes(assemblies)
     .AsClosedTypesOf(typeof (ICommandHandler<>))
     .AsImplementedInterfaces(); 

这可以很好地工作,并为那里的封闭类型注册我的所有处理程序。我现在想为所有的处理程序注册一个通用的装饰器,例如

LoggingCommandHandlerDecorator<>

在autofac文档中,您需要命名您的实现,以便decorator可以是默认的ICommandHandler。我不确定在注册开放泛型时这是如何工作的。我已尝试将一个名添加到打开的注册中。

  builder.RegisterAssemblyTypes(assemblies)
            .AsClosedTypesOf(typeof (ICommandHandler<>))
            .Named("commandHandler", typeof (ICommandHandler<>))
            .AsImplementedInterfaces();

注册装饰师,但没有乐趣。

 builder.RegisterGenericDecorator(typeof (LoggingCommandHandlerDecorator<>), typeof (ICommandHandler<>),
          fromKey: "commandHandler");

感谢您的帮助。

我和你做了同样的事,但没有工作;然后在下面找到了解决方案。作者Boby Johnson-Gist

    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
       .As(type => type.GetInterfaces()
           .Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>)))
           .Select(interfaceType => new KeyedService("commandHandler", interfaceType)))
       .InstancePerLifetimeScope();

根据此处的autofac文档,请尝试以下解决方案:

// Register the open generic with a name so the
// decorator can use it.
builder.RegisterGeneric(typeof(CommandHandler<>))
            .Named("commandHandler", typeof(ICommandHandler<>));
// Register the generic decorator so it can wrap
// the resolved named generics.
builder.RegisterGenericDecorator(
            typeof(LoggingCommandHandlerDecorator<>),
            typeof(ICommandHandler<>),
            fromKey: "commandHandler");

最新更新