2009-11-05 8 views
30

私は依存性注入に比較的慣れていません。DIを使用する際には、それぞれのベストプラクティスとアンチパターンを覚えておきましょう。依存性注入のベストプラクティスとアンチパターン

+2

「言語には関わらない」とは思えません。異なる言語が根本的に異なるアプローチを指示しています。あなたはRubyと同じようにC++で同じことをしたくないでしょう。 –

+2

それから言語ごとに別々の質問をする価値があるかもしれませんか?それでも十分な一般的なパターンがあるので、一般的な質問が順調であると思います。 – ripper234

+0

私は、[依存性注入ドキュメント](http://stackoverflow.com/documentation/dependency-injection/topics)のトピックをチェックするために、この質問に貢献したいと思っている人はお勧めします。 – dimo414

答えて

1

私は、Law of Demeterの違反を見ると、依存性注入が必要なことを示唆しています。例えば

void doit() 
{ 
    i += object.anotherobject.addvalue; //violation of Law of Demeter 
} 

は時々私はanotherobjectを注入依存関係する場合がありますことを示唆しています。

+0

少し恣意的と思われます... –

+2

これは少しの跳躍ですが、いくらか意味があり、不完全です。あなたがデメテルの法律に違反したことを発見した場合、抽象化することを選択する機会があります。抽象化を行うたびに、依存関係を注入するのではなく、自分で作成することができます。これは指標ですが、ただのことです。潜在的に抽象化する機会が増える可能性があります.DDIが実現する可能性があるよりも実装コストが高い場所では、DIを使用しないでください。それでも、+1。 –

0

DIをいつ使用するかについての私の基本的なルールは、私が層の間に注入するということです。私のコントローラーとDAOの間に層があるので、注入することができます。

私はDIを同じレイヤー内で使用するのは良いアイデアではないと主に考えています。層が密接に結合されている必要があります。

たとえば、DAOが別のコンピュータにある場合は、それらが1つのレイヤーであると見なす必要がありますが、実際にはDIを使用して1つのマシンと別のマシンのすべてを切り替えます。開発者は1台のマシンですべてを処理でき、別々のマシンで動作するはずです。

しかし、何か緊急の必要がなければ、同じ層内のDIは不要な複雑さだと思う。

+2

レイヤ内で依存関係注入を使用すると、既存のコンポーネントインスタンスを再利用してリソースを節約できます。また、モジュール設計を強制することによって、優れたプログラミング習慣を育てているとも言えます。 –

+0

私はちょうどそれが必要以上に複雑になるのを見ていますが、それは層に何があるかによって異なります。私はレイヤー間でやりとりする傾向がありますが、レイヤー間でやりとりすることが役立つかもしれない理由を説明したので、私が提案するものではありません。 –

3

私の意見では、Dhanji Prasannaの本Dependency Injectionは、初心者と専門家の両方にとって、ソフトウェアデザイナーのために読んでおく必要があります。あなたのDIに関する質問を直接扱います。

+4

もう一つの偉大な本は[Mark Seemannの.NETの依存関係注入](http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501)です。 – Steven

8

私はこのDIに関する記事を本当に楽しんでいます。それはDI体験のトンを持たない人、またはそれが何であるのか知りません。

https://mtaulty.com/2009/08/10/m_11554/

Unityは何ですか?

It’s a “dependency injection container”. 

さて、その時点で人々 読みの束が、これははい、私たちは を知っていると我々はすでに A、B、Cの理由のためにそれを使用しているか、我々が使用しないことを選択しました」と言うだろうそれは理由X、Y、Zのための と私は 他の人々の束が言うかもしれないと想像する;

“Huh? What’s a dependency injection container?” 

この投稿は、後者の人々のためにある - 網羅的であることを意味していないが、 がうまくいけば、それはどちらかの役に立たない完全 ではありません

3

:-) Guiceののuser's guideにおけるベストプラクティスのセクションがありますです。