2012-04-27 7 views
1

最近、私は自分自身がクラスの依存関係をあまりにも重視して世話するのではなく、コンストラクタで渡すことに気付いていますが、私は常にDIコンテナを渡してプライベート属性にしておきます。このようにして、私のクラスはあまり明確な依存関係を持たないでしょう。必要なときにコンテナからすべてを取得します。DIコンテナを(ほぼ)各クラスに注入するアンチパターンですか?

何とか(コンテナにアクセスすることによって発生するオーバーヘッドを除いて)私はこのソリューションについて悪い気持ちを持っていますが、あまりにも多くの欠点を考えることはできません。たぶん、依存関係の定義が緩いと、クラスの移植性が低下する可能性があります。リファクタリングすると驚くことはありますか?

あなたはこれについてどう思いますか?

+0

コンテナをクラスに注入することは、サービス・ロケータのパターンの一種に過ぎず、静的なサービス・ロケータ・インタンスを呼び出すことと(ほとんど)悪影響を及ぼします。 – Steven

+0

も参照してください。http://stackoverflow.com/questions/23931321/why-injecting-whole-service-container-to-another-service-is-almost-always-a-ba –

答えて

10

間違っています。オブジェクトにDIコンテナを入れないでください。彼らは彼らが注射されていることを知っているか気にする必要はありません。これは「私たちに電話しないでください、私たちはあなたに電話します」と正方形ではありません。

これはもう一つの方法です:全体のアプリはDIエンジンについて知っていますが、必要なBeanを取得します。

あなたは、アノテーションがいくつかの関係を変えていると主張しているかもしれないと思います。今では豆と結びついていることを知っています。しかし、構成がXMLに外部化されたとき、豆はDIを知らないことは事実でした。

+0

良い回答ありがとう! – gphilip

0

これは反パターンであり、私は本当に悪いあなたのコードに対してまだテストを書いていないと確信しています。

、あなたが未検証可能なコードを書いている、とあなたがしていることがわかりますテスト書き込みを開始します。

あなたはの法律に違反しているサービスロケータアンチパターン

  • を使用して

    • をデメテル

    • あなたはハイテクいるシングル責任の原則

    • を次されていません責任はビジネスロジックです:

      • ビジネスオブジェクト:鼎あなたのオブジェクト本当の依存性は、あなたが任意のアプリケーション内のオブジェクトの二つの大きな山の間に本当の分離を持っていない

      • (依存関係インジェクションパターンを使用していません) 、ドメインの抽象化

      • 配線や建物オブジェクト:責任は、あなたがしたい日

    をオブジェクトグラフを構築することですあなたのコンポーネントの単体テストを書く場合は、この決定を後悔します。単純な単体テスト(テストコンテナを作成し、このコンテナにモックを注入する)ではなく、コードをリファクタリングするか、または統合テストを書くでしょう。

    私のアドバイスは、テスト可能なコードを書くためにこのガイドを読んでされています(これはグーグルで頑張ってみんなが使用するガイドです)

    http://misko.hevery.com/code-reviewers-guide/

    ご希望の場合は、約Misko Heveryからこれらのビデオで始まりますテストとクリーンなコード会談の心理学:

    http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded

    http://www.youtube.com/watch?v=RlfLCWKxHJ0&feature=player_embedded

    http://www.youtube.com/watch?v=-FRm3VPhseI&feature=player_embedded

  • +0

    あなたはここで少し状況を演出していると思います。私は実際に私のクラスに単体テストを書いていますが、DIコンテナでフィクスチャを定義することは、直接渡すのではなく、複雑になります。私はSRPについてのあなたの意見に同意するものでもなく、デメテルの法律(コンテナです)についてあなたが言うことの一部にしか同意しません。ここではあまりにも多くのことを暗示しています。 – gphilip

    関連する問題