今、IoCコンテナ(私の場合はNinject)に依存しないアセンブリで定義されているサービスがいくつかあります。メインプロジェクトでは、コンテナに登録されたデータアクセス用IRepositoryがあります。一般的なIoCの練習 - サービスがお互いに依存するのは間違っていますか?
this.Bind<IRepository>().To<EntityFrameworkRepository<MyDatabaseEntities>>();
私もIAuthenticationServiceとIErrorLoggerサービスは、その具体的な実装、私は彼らのロジックのためのリポジトリを使用する場合、登録されています。しかし、私はこれをいかに最高に達成するかについてはわかりません。現在、両方の具体的な実装上の私のコンストラクタはIRepositoryパラメータを取ると、私はそれらを登録するときにそれを渡します。ここでは
this.Bind<IAuthenticationService>().To<MyAuthenticationService>().
WithConstructorArgument("myRepository", ctx => ctx.Kernel.Get<IRepository());
は、私はちょうどIRepositoryインスタンスを取得し、コンストラクタにそれを渡すためにコンテナに伝えます。
サービスアセンブリをninjectや共通サービスロケータ(CSL)に依存させることについて正しくは感じませんでしたが、現在の方法についてもわかりません。私は意見や代替ソリューションを探しています。
私の他のサービスでIRepositoryを使用しない場合は、基礎となるIRepositoryタイプ(偽のデータと実際のデータの両方のAuthenticationServiceなど)ごとに、これらのサービスの新しい具体的な実装を作成する必要があります。それは多くの論理反復であろう。
素晴らしい情報!あなたは正しいです、私はWithConstructorArgumentをまったく指定する必要はありませんでした。それらは自動的に注射された。もう1つの質問は、2つのIRepository実装を登録し、それぞれが異なる名前で登録する場合です。それから私は注入するものを指定したい。私はNinjectを持つNamedAttributeがあることを知っていますが、私のサービスアセンブリにNinject依存関係を追加するのを避けるために、私はそれを使いたくありません。だから手動で指定するとこの場合に行く方法でしょうか?参考までに、繰り返しの懸念事項はIRepositoryではなく他のサービスクラスです。 – Adam
Ninjectの場合、 'WhenInjectedInto()'を使うことができます。ここで、Fooはあなたのサービスクラスです。通常は、リポジトリの具体的な実装の1つを登録するだけです。偽のデータとテスト用のものは、メインアプリケーションの一部として別のテストコンテナに登録しないでください。 –
BrokenGlass
パーフェクト、もう一度ありがとうございます。 – Adam