22

私は 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>>()
4

1 に答える 1

46
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>{}
于 2012-04-20T09:37:42.757 に答える