Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。票8歴史には沿っていないと思いますが、次のように考えてみました。巨大なプログラムがあるそれをコンポーネントに切り分けていく。インターフェイスを挟む。替えはきくが、内部を変更する必要がある。その代りオブジェクト生成が複雑になり、その生成ロジックが分散している。登録しておいた生成ルールを使い、DIコンテナにオブジェクトを生成させる依存性の注入までは小規模のコードでもわかりやすく、実際テストに便利だったりします。一方で、それぞれのオブジェクトへの依存が少ない、質問に例示されたようなコードでは「同じ生成ロジックが分散する」と感じにくいですし、コンテナを使うメリットは薄いかもしれません。生成しなければならない個所が増えた場合はどうでしょうか。したとして、それを変更したくなったら?単に具象クラスが違うということ以外にも、生成方法が異なることがあります。既存のインスタンスを使いたいかもしれません。DIコンテナを使えば、「これはこうすれば生成できる」というパターンを最初に登録しておくだけで、あとはコンテナが適切に組み合わせてくれます。Aが依存するBはさらにCに依存していて・・・みたいなのも含め。いう一貫した手順でオブジェクトを生成できるというのは、コードの可読性にもつながるのではないでしょうか。外部からオブジェクトを注入しますが、直接具象クラスに依存することを避けるだけならファクトリパターンやサービスロケータといった手法もあります。Sol());この部分は具象クラスであるSolクラスに依存してしまいます。Sol()する箇所も多くなります。SolクラスをKyクラスに変更したくなった場合、修正箇所が多くなりメンテナンス性が低くなります。Sol()する箇所が多くなると非常に辛くなってきます。構造に変更があった場合、修正が大変です。Sol()する箇所をDIコンテナにバインドする一箇所に限定することができ、メンテナンス性が高くなります。構造が複雑な場合でも、構造はバインド箇所のみに隠蔽されます。DIコンテナにオブジェクトを格納して、シングルトンパターンとして利用することもでき、メモリの効率化も行えます。PHPとpimpleというDIコンテナの例になりますが、以下のサイトが参考になります。方にも、コードが示せると説得力が増すと感じました。Injection)一般論としては、「ソフトウェア・コンポーネント間の依存性軽減」が目的でありメリットでもあると思います。コンポーネント間の依存性が小さくなる(モジュール結合度が小さくなる)ことの副次効果として、部品単位での単体テストのやり易さや、部品の再利用性向上も挙げられます。大規模ソフトウェア開発でこのようなメリットが歓迎されます。DIコンテナを使うのかDIの何が嬉しいの?一方で依存性軽減の実現には、インターフェイスのような抽象レイヤを追加する必要があり、実装面ではオーバーヘッドがあることも確かです。万能なソフトウェア設計という物は存在しませんから、対象や状況に応じて採用可否を判断すべきですね。|2具体的な例は他の方が回答されているとおりですが、私がDIのメリットとして理解しているのは、次の点です。オブジェクトの生成の問題とその他の問題を分ける強制力となること1の恩恵として、狭いスコープ(インターフェイス指向)でのプログラミングが可能になること2の恩恵として、個々のクラスをメンテナンスしやすくなることここで、2が重要なポイントです。質問に書かれているコードにおいて、Test1()、Test2()はいずれも、オブジェクト生成の問題と、それ以降の処理の問題とを1つの視点から見たコードになっている、という点で全く同じです。kernel.Bind<PersonManager>().ToSelf();この2行のあたりが、オブジェクトの生成の仕方を指示しているコードですから、通常は何らかの用意された専用の場所(モジュール等)へ記述して管理します。次に、オブジェクトの生成以外の処理は、オブジェクトの生成の仕方を気にしないというだけでなく、それが具体的にどのクラスのオブジェクトであるのかも、通常は気にしないようにプログラミングします。PersonManagerを抽象化したインターフェイスのみを使うようにします。pmがSolなのかKyなのかを気にしない}このように、処理の部分はIPersonManagerに定義された、限られたメソッドだけを使うコードになります。このようなスタイルでのプログラミングは、DI(コンテナ)に頼らなくても可能ですが、DIを使う場合はある意味強制的にこのようなスタイルにせざるを得なくなるため、一定の設計改善効果があるといえます。8:36質問の意図をくみ取りきれず、すみませんでした。|1DIコンテナを使った場合、ユニットテストが容易になります。依存している実装を外部から差し替えることが可能になるためです。個の銅バッジ1その記事にも「面倒な事前処理(主にコンストラクタ生成ですが)をやってくれるのがDIコンテナ」と書かれているように、コンテナを使わなくてもDIは可能です。|0マルチプラットフォーム開発をしているとDIは便利に使えます。プラットフォームに依存したアプリケーション(この場合はWindows)このほかにインターフェイスを定義したDLLなどなどがあるとします。Windowsプラットフォームに依存するクラスをHoge.Win32.Dllに作ってそのクラスを使用するクラスをPCLなどでHoge.Core.Dllとかに作ったとき。Hoge.Core.Dll内ではHoge.Win32.Dll内のクラスを知らないままインターフェイス経由で利用しなければなりません。この時にクラスの生成に困るのです。そこでHoge.Win32.exeにてDIの設定をすることで、Hoge.Core.Dll内でWin32の具象クラスを知らなくてもインスタンス化できて利用できるのです。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。会を開催します🎉コメントで回答する理由を教えてくださいサイトの未翻訳箇所を見つけて、もくもく会で直しましょう関連する質問5マルチテナントサイトでURLにテナントIDを含めるメリットはなんですか?0C#でタブにwebbrowserを追加することはできましたが操作が分かりません。メソッドのメリットが知りたい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。