web-dev-qa-db-ja.com

Ninjectでジェネリック型インターフェースをバインドする方法

私はNinjectにかなり慣れていないので、一般的なリポジトリパターンを実装するようになったときにつまずきました。依存関係をバインドしたいIRepository <IEntityType>クラスにConcreteRepository <EntityType>ここで、ConcreteRepository <T>はIRepository <T>を実装し、EntityTypeはIEntityTypeを実装します。私はこれを試しました:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();

...しかし、Ninjectは、EntityTypeがIEntityTypeを実装することを知らないか、気にしないため、それを受け入れません。この依存関係をバインドするにはどうすればよいですか?

[〜#〜] update [〜#〜]

これは私が得ているエラーです:

エラー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>>()
21
McGarnagle
kernel.Bind(typeof(IRepository<>)).To(typeof(SimpleRepository<>));

ここで必要な場合は、私のものを見てください: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html バインディングの例があります

編集:

あなたが得ているエラーは、あなたの具象リポジトリがあなたがバインドしたい一般的なリポジトリのインスタンスではない、すなわちあなたがこれをする必要があるということです

public class ConcreteRepository<ConcreteEntity> : IRepository<IEntity>{}

ない

public class ConcreteRepository<ConcreteEntity> : IRepository<ConcreteEntity>{}
44
Not loved