私は Ninject にかなり慣れていないので、一般的なリポジトリ パターンを実装するようになったときにつまずきました。ConcreteRepository<T> が IRepository<T> を実装し、EntityType が IEntityType を実装するクラスConcreteRepository<EntityType>に依存関係IRepository<IEntityType>をバインドしたいと考えています。私はこれを試しました:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
...しかし、Ninject は、EntityType が IEntityType を実装していることを知らないか気にしないため、それを受け入れません。この依存関係をバインドするにはどうすればよいですか?
アップデート
これは私が得ているエラーです:
エラー 3 型 'ICM.Dependency.Repository.ConcreteRepository' は、ジェネリック型またはメソッド 'Ninject.Syntax.IBindingToSyntax.To()' の型パラメーター 'TImplementation' として使用できません。「ConcreteRepository<EntityType>」から「IRepository<IEntityType>」への暗黙的な参照変換はありません。
解決
バインディングが機能しない理由はまだよくわかりませんが、ジェネリックを間違って使用していたことは明らかです。そのため、ソリューションは実際には NInject とは関係ありません。IEntityType と TEntityType を明示的に接続するために、ConcreteRepository の指定を終了しました。
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
次に、注入は次のように記述できます。
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()