Предположим, простой интерфейс:
public interface ICommandHandler<T> { void Handle(T command); }
Предположим несколько реализаций для разных конкретных
T
, например:public class FooCommandHandler : ICommandHandler<FooCommand> { /*...*/ }
Предположим, что универсальная фабричная реализация этого интерфейса:
public class FactoryCommandHandler<T> : ICommandHandler<T> { public FactoryCommandHandler(Func<ICommandHandler<T>> factory) { /*...*/ } /*...*/ }
Теперь я хочу зарегистрировать обработчик фабрики из 3 как экземпляр, который разрешается при разрешении ICommandHandler<T>
.
Моя проблема в том, что я не могу правильно зарегистрировать другие реализации, поэтому фабрика для их можно разрешить.
Вот что я пробовал:
builder.RegisterAssemblyTypes(assembly)
.Where(type => type.Name.EndsWith("CommandHandler"))
.Named("concreteCommandHandler", typeof(ICommandHandler<>));
builder.RegisterGeneric(typeof(FactoryCommandHandler<>)
.WithParameter(
(p, c) => true,
(p, c) => c.ResolveNamed("concreteCommandHandler", p.ParameterType))
.As(typeof(ICommandHandler<>));
Однако это не удается, поскольку Func<ICommandHandler<SomeConcreteCommand>>
не зарегистрирован. Autofac, похоже, не может автоматически создать фабрику в этом случае, которую он обычно поддерживает.
Как исправить регистрацию и достичь своей цели?