依存性注入を使用して構成を管理するにはどうすればよいですか?


18

私はDI / IOCの大ファンです。ハードな依存関係の処理/抽象化に最適であり、作業が少し楽になります。

しかし、私はそれについて少し不満があり、それを解決する方法がわかりません。

DI / IOCの基本的な考え方は、オブジェクトがインスタンス化されると、その依存関係はすべてコンストラクター内で事前に入力されるということです。

ただし、IMHOには、コンストラクター用のパラメーターのタイプがいくつかあります(特にオブジェクトが不変の場合)。

  1. 依存関係(オブジェクトが機能するために必要なオブジェクト)
  2. 構成(作業を行うために必要な環境に関する情報)
  3. パラメーター(作業が行われるデータ)

IOCは依存関係でうまく機能することがわかりました。しかし、私はまだ他の2つに対処する最善の方法を考えています。ただし、コンストラクターはIOCコンテナーによって実行されるように実行されるため、これらのアイテムをIOCコンテナーに配置する必要があるようです。

人々が採用している戦略/パターンと、人々が発見した利点と欠点を知りたい。

NB。これは非常に主観的な質問であることを認識しており、SEガイドラインに従って「良い」主観的な質問にしようとしました。


「構成」とは、開発環境の構成(開発や本番など)を意味しますか?もしそうなら、私は通常それを伝統的な依存関係として扱います。
メタファイト14

依存関係を使用して構築するのが最適ですが、デフォルトの構成であるため、オブジェクトは整形式です。追加のメソッドを呼び出して、構成およびその他のパラメーターを設定します。俳優でやりすぎは悪いことです。
david.pfx 14

I am still trying to work out the best way to deal with the other two-それらを通常のパラメーターとしてオブジェクトに渡しますか?
ロバートハーヴェイ14

@RobertHarvey不変オブジェクト?デバッグがはるかに簡単になります。
ArT 14

回答:


9

構成(作業を行うために必要な環境に関する情報)

環境に関する情報を提供することを目的とする構成クラスを作成します(選り好みするために:インターフェース+実装)。これにより、オブジェクトを機能させるために必要な他のオブジェクトと構成がまったく異なるものになりません(ポイント1)。

パラメーター(作業が行われるデータ)

あなたはおそらく見つけるポイント1へのリード線も、このように、しかし、オブジェクト指向環境では、プリミティブデータ型は、オブジェクトにカプセル化することができ、このSOの質問の DIを使用する場合に興味深い、それは、正確に、コンストラクタでプリミティブのパラメータの状況を扱います容器。与えられた例では、設計を改善することができ、コンストラクターでプリミティブ型の必要性を完全に回避しました。


1

私がしているのは、これらのケースの工場パターンです。

オブジェクト自体を依存関係として使用するのではなく、コンテナによって自動的にバインドできないパラメーターを受け入れるGetメソッドを使用してファクトリオブジェクトを作成します。

例:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.