Да приемем прост интерфейс:
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 изглежда не може автоматично да създаде фабрика в този случай, която обикновено поддържа.
Как да коригирам регистрацията и да постигна целта си?