2

私はNinjectと協力して、依存性注入を使用してアプリケーションを実装しています。私は概念をかなり完全に理解しており、アプリケーションがDIを使用して実現した疎結合でテスト可能なアーキテクチャを本当に気に入っているように感じます。しかし、私は特定の種類のサービスに苦労しており、自分が何か間違ったことをしているのか、他の人が同じことをしているのかについての洞察を探しています。

基本的に、私はそれらに依存する他のサービスを持たないいくつかのサービス/クラス(かなり少数)になってしまいます。このため、クラスはアプリケーションで有用な役割を果たすため、必要な場合でもインスタンス化されることはありません。例として、私がIMonkeyRepositoryサービスとサービスを持っているとしましょうIMonkeyPopulatorIMonkeyPopulatorサービスには実際にはパブリックAPIがなく、その唯一の責任(単一責任の原則に従う)は、ネットワーク上でサルを発見し、それらを投入することであると想定IMonkeyRepositoryします。このサービスはIMonkeyRepository、ネットワークとの相互作用を処理するために、およびおそらく他のいくつかのサービスに依存しています(たとえば、ポートとアドレスの構成データ)。ただし、にIMonkeyPopulatorはパブリックAPIはなく、単なる空のインターフェースです。

これは悪いデザインですか、それとも私が見逃しているある種のコードの臭いですか?この機能をリポジトリ自体に移動することはできますが、それはSRPに違反しているように見えます(リポジトリには便利なアクセス機能などがあり、実際には複数のサービスが存在する可能性があります)。私が検討または試したが満足していないいくつかのアプローチは次のとおりです。

  1. サービスに、サービスを開始するために呼び出す必要のあるStartなどの単一のパブリックメソッドを持たせます。これには、この呼び出しを行うためにシステム内のいくらか任意の場所を決定する必要があるという欠点があります。
  2. Ninjectカーネルの作成時にインスタンス化する定数にサービスをバインドします。これには、誰もこのサービスに依存していないことを理解する必要があるため、特別に処理する必要がありますが、これは間違っているようです。
  3. いくつかのメンバーをサービスに追加し、これらの値(サービスのステータスなど)を読み取るGUIをアプリケーションのどこかに作成します。明らかに、この理由でのみ存在するGUIをアプリケーションに追加する必要があるのは非常にばかげています(ただし、デバッグなどに役立つ場合もあります)。

何か考えやガイダンスはありますか?

4

2 に答える 2

3

IMonkeyPopulatorに依存するとおっしゃっていますIMonkeyRepositoryが、その逆のようですが?IMonkeyRepositoryに依存しているように思われるため、を注入する必要がある場合がありIMonkeyPopulatorます。他のサービスも問題なく注入した場合、内部的には、リポジトリに実際に何かがあるように「開始」するようにIMonkeyRepository指示できますか?IMonkeyPopulator私は問題を誤解しているかもしれません...多分私はそんなに猿をしているべきではありません:/

于 2013-01-17T05:22:21.173 に答える
3

IMonkeyPopulatorしたがって、あなたはActiveObjectバックグラウンドでtcp接続をリッスンし、そのデータをリポジトリに書き込むようなものです。アプリケーションの観点から言えば、コンストラクターでtcp接続を開始したくないため、アクティブオブジェクトを開始および停止する必要があります。したがって、バインディングのOnActivationandOnDeactivationメソッドを使用して、次のようにサービスを開始および停止できます。

 This.Bind<IPopulatorService>().To<>().OnActivation((c, i) => i.Start()).OnDeactivation((c, i) => i.Stop())

IPopulatorServiceただし、アプリケーションでインスタンス化するには、アプリケーション内の誰かがをフェッチ/取得する必要があります。これを実現するために、私は通常、ここhttp://www.appccelerate.com/bootstrapper.htmlでブートストラッパーパターンを使用します。

于 2013-01-17T05:32:37.557 に答える