私は次のインターフェースを持っています...
public interface IHandler<in TFor> where TFor : IRequest
{
void Handle(IEnumerable<TFor> requests);
}
これは通常、次のように実装されます...
public class AssignmentHandler : HandlerBase, IHandler<AssignmentRequest>
{
public void Handle(IEnumerable<AssignmentRequest> assigmentRequests)
{
foreach(var request in assignmentRequests).....
}
}
IRequest
は単なるマーカー インターフェイスです (この時点では)。
次の規則を使用して、すべてのハンドラーを登録します...
public override void Load()
{
Kernel.Bind(x => x.FromAssemblyContaining<IHandler>()
.SelectAllClasses()
.InheritedFrom(typeof(IHandler<>))
.BindAllInterfaces());
//i also tried...
Kernel.Bind(x => x.FromAssemblyContaining<IHandler>()
.SelectAllClasses()
.InheritedFrom<IHandler<IRequest>>()
.BindSingleInterface());
}
個々に問題なく解決します。
すべてのハンドラーを解決し、それらをコンストラクターに注入したい状況が 1 つあります...
public SomeConstructor(IEnumerable<IHandler<IRequest>> allHandlers)
これは機能せず、常に空を返します。
私の理解は、慣例によりそれらを として登録したためであり、これは 2 つの異なる署名ではありIHandler<ConcreteRequest>
ません。IHandler<IRequest>
すべてのハンドラーを慣例により、まとめて識別されるように登録するにはどうすればよいIEnumerable<IHandler<IRequest>>
ですか?
2 番目の登録は問題ありませんが、両方の署名を使用して 1 つの実装を解決することをお勧めします。