私は最近、DIを適切に行うことについて尋ねました。ブログに関する記事へのリンクがいくつかあります。私は今、より良い理解を持っていると思います。それは、オブジェクトをロジックから分離し、工場に入れることです。しかし、すべての例はウェブサイトのようなものであり、起動時にすべての配線を行うと言います。 new
がすべての依存関係をすべて通過している大きな工場を呼び出します。実行時にファクトリをいつどこに呼び出すか?
しかし、前もってすべてをインスタンス化したくない場合はどうすればよいですか?私は委任できる他のオブジェクトのリストを含むオブジェクトを持っていますが、それらは高価であり、一度に1つずつ使用されるので、必要なときにそれらを構築し、完了したら収集させます。私はA
のロジックの中にnew B()
を入れたくないのですが、私はむしろDIを使いたいのですが、どうですか? A
は工場に電話できますか?工場が現在の依存関係を含む状態を維持していない限り、それははるかに良いとは思われません。私はちょうどB
の完全なリストをA
に渡すことは無駄であるので、それが構築されたときには望んでいません。あなたがしたい場合、それは(A
がゲームレベルで、B
は単一の画面で)論理的な意味になりますが、B
が作成されたときにどのような場合にA
の論理が指示ものの、B
は必ずしもは、A
内であることをを持っていません。
だから、誰が工場に電話してB
になるのですか?
説明:私はDIのフレームワークを使用していません。私は、用語DIがそれを意味するのだろうか?
グレート質問:
は今の代わりに
ExpensiveImpl
を注入するのは、他のインスタンスにServiceProxy
を注入することができます。私もこの問題で混乱してきました。また、時々私は何か(とそれの任意の数)の複数のインスタンス化をしたいと思うし、それがうまくいく方法が非常に混乱しています。私はちょうどそれを吸い込み、 'IKernel'を注入しましたが、私はそれが怒られていることを理解するために与えられました。 (私の経験では、非常に強力で、それを後悔していません - そして、私はDIフレームワークを "交換する"ことに遠くから関心を持っていないので、利益は私には間違いです) –それは、パターンのいくつかの宗教的な理解を持っています。すべてのタイプがIKernelを知っているか、DIフレームワークのあなたの味の中で何が言われていようとも、私は行き過ぎではありませんが、時にはそれが最善の方法です。私もこれをやったし、何も私の上で爆発しなかった。 – Andy