私は.NET 4.5、Ninject 3を次のように慣例libによるバインディングで使用しています:
kernel.Bind(x => x
.FromAssembliesMatching("assembly.dll")
.SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
.BindAllInterfaces());
そして、これは次の場合に適切にバインドされます:
public class MyCommandHandler : ICommandHandler<MyCommand>
しかし、バインドしません:
public class MyGenericCommandHandler<T> : ICommandHandler<MyGenericCommand<T>>
ただし、次のようなジェネリック クラスの特定の実装に個別のバインディングを追加すると、前のバインディングが機能します。
kernel.Bind(typeof(ICommandHandler<MyGenericCommand<float>>))
.To(typeof(MyGenericCommandHandler<float>))
kernel.Bind(typeof(ICommandHandler<MyGenericCommand<int>>))
.To(typeof(MyGenericCommandHandler<int>))
ただし、個々のジェネリック型をそれぞれ追加すると、規則の目的が無効になり、float、int、string などの可能な個々の型ごとにバインディングを追加する必要があります...
私のコマンドの汎用バージョンをサポートするために、規則を変更する方法、または別の規則を追加する方法 (またはまったく異なるソリューションを使用する方法) を知っていますか? つまり、2 レベルのジェネリックをサポートします。