単純なインターフェースを想定します。
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 は通常サポートしているファクトリを自動的に作成できないようです。
登録を修正して目標を達成するにはどうすればよいですか?