2009-09-27 16 views
5

テスト容易性以外にも、D.I.を利用する大きな利点は何ですか? (そして私は静的クラスよりもD.I.フレームワークやIoCについて話していません)?特に、サービスがスワップアウトされないことを知っているアプリケーションの場合。テスト以外に、静的クラス/メソッドより依存性注入はどのように優れていますか?

私たちのC#アプリケーションの1つでは、私たちのチームは静的メソッドを使用するのではなく、Web Web GUI、サービスレイヤー、およびリポジトリレイヤーでDependency Injectionを利用しています。過去には、静的クラスによって作成、変更、渡され、保存されたPOCO(ビジネスエンティティオブジェクト)がありました。

は、例えば、過去に我々が書かれている場合があります:

//not shown, _creditService instantiation/injection in c-tors 
CreditEntity creditObj = _creditService.GetCredit(customerId); 
Decimal creditScore = _creditService.CalculateScore(creditObj); 
return creditScore; 

あまり違いはありませんが、今、私たちは数十を持っている:

CreditEntity creditObj = CreditEntityManager.GetCredit(customerId); 
Decimal creditScore = CreditEntityManager.CalculateScore(creditObj); 
return creditScore; 

さて、DIと、同じコードは次のようになりますより広範なスコープを持つサービスクラスです。つまり、静的であるかのように扱う必要があります(つまり、依存関係の定義に使用されていない限り、privateメンバー変数はありません)。さらに、これらのメソッドのいずれかがリソース(データベース/ Webサービス/ etc)を利用する場合、依存関係を削除して古い静的メソッドまたはusing(...)メソッドを使用しない限り、並行性の問題を管理するのが難しいことがわかります。

+5

"テスト容易性の他に、D.I.を利用する大きな利点は何ですか? 「私の頭の上に屋根を置く以外に、仕事をするのに大きな利点は何か」と私に言っているようなものです。 – TrueWill

答えて

5

D.I.可能性があります:CreditEntityManager実際にCreditEntityを見つける方法についての知識を集中化する自然な場所とCalculateScoreに行く場所ですか?

私はD.I.事Xに関与モジュラーアプリケーションは、必ずしも事Yでも X しかしニーズYにフックアップする方法がわからないということです。

例では、サービスプロバイダが見つかってデータオブジェクトに組み込まれた後にコードフローが表示されます。その時点で、確かに、D.Iの有無にかかわらず。たとえプログラミング言語やスタイルなどによっても同じである可能性もあります。正確にはです。

これらのさまざまなサービスがどのように接続されているかが鍵です。 D.I.では、潜在的にサードパーティのオブジェクトは本質的に構成管理を行いますが、それ以降はコードはほぼ同じでなければなりません。 D.I.後でコードを改善するのではなく、問題のモジュラー性をプログラムのモジュラー性と照合して、論理的に正しいモジュールやプログラムロジックを編集する必要がないようにしますが、間違ったサービスに接続しますプロバイダ。

+0

特にカプセル化されていない社内サービス/コンポーネント(すなわち、私たちはそれらを交換することはない)のために、D.I.はるかに多くの利益をもたらしませんか? –

+1

ユニットテストのためにモックオブジェクトとサービスをプラグインすることもできます。すでにテストフレームワークを持っていて、サービスの接続を再設定しない、あるいは既に受け入れ可能なプラグインアーキテクチャを持っている場合は、D.I.を使わずに勝ちます。プラグインやテストフレームワークはD.I.デザインパターン。 – DigitalRoss

1

これにより、コードを開かずに実装をスワップアウトすることができます。たとえば、私のアプリケーションの1つでは、データソースを照会するためのメソッドを定義したIDataServiceというインターフェースを作成しました。最初のいくつかのリリースでは、nHibernateを使用してOracleの実装を使用しました。後でオブジェクトデータベースに切り替えるため、db4oの記述と実装、実行ディレクトリへのアセンブリの追加、および設定ファイルの行の変更が行われました。プレスト!私たちはdb4oを使用してコードを開かずにいました。

1

これは正確に1002回論じられています。ここで私が覚えているそのような議論は、(順番に読んで)です:

  1. http://scruffylookingcatherder.com/archive/2007/08/07/dependency-injection.aspx
  2. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-More-than-a-testing-seam.aspx
  3. http://kohari.org/2007/08/15/defending-dependency-injection
  4. http://scruffylookingcatherder.com/archive/2007/08/16/tilting-at-windmills.aspx
  5. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-IAmDonQuixote.aspx
  6. http://scruffylookingcatherder.com/archive/2007/08/20/poking-bears.aspx
  7. http://ayende.com/Blog/archive/2007/08/21/Dependency-Injection-Applicability-Benefits-and-Mocking.aspx

あなたの特定の問題については、サービスライフスタイルを正しく管理していないように思われます。たとえば、サービスの1つがステートフルな(非常に珍しい)場合、おそらく一時的でなければなりません。すべての疑問を解消するために必要なだけ多くのSO質問を作成することをお勧めします。

+0

しかし、サービスが一時的な場合は、なぜオブジェクトをインスタンス化するのですか?ステートレスオブジェクトは論理的には静的クラスでよりよく表現されますか? –

+0

DIコンテナを使用する場合は、サービスをコーディングして、各サービスに適したライフスタイルでコンテナを設定します(Webリクエスト、スレッドごとなど)。これを実行するには、サービスをインスタンス化する必要があります。疑問がある場合は、他の質問を作成してください。 –

+0

+1正確なカウントを与える。笑! – TrueWill

0

D.I.を使用するための素晴らしいサンプルケースを提供するGuice videoがあります。あなたが動的に夢中になる必要のある第三者のパーティーサービスをたくさん使っているなら、私は大きな助けになるでしょう。

関連する問題