2011-08-19 12 views
5

Properties.Settings.Defaultをクラス内で依存関係として使用することを考慮する必要がありますか?Properties.Settings.Defaultに依存性注入を使用しますか?

例えば:

public class Foo 
{ 
    private _settings; 
    private bool _myBool; 

    public Foo(Settings settings) 
    { 
     this._settings = settings; 
     this._myBool = this._settings.MyBool; 
    } 
} 


またはSettingsのアプリケーションをグローバルなアプリケーションとして使用することをお勧めしますか?

例えば:

public class Foo 
{ 
    private bool _myBool; 

    public Foo() 
    { 
     this._myBool = Properties.Settings.Default.MyBool; 
    } 
} 

答えて

2

設定をクラスにカプセル化し、そのためのインターフェイスを用意することができます。あなたの設定がどこから来るかは、単体テストなどのために変更することができます。 IoCコンテナも使用している場合は、設定をコンテナに登録してください。

私はConfigurationManagerWebConfigurationManagerのためにこれを行い、テスト用の設定を注入することができます。 Nathan Gloyn has wrapped the adapters and interface up already in a projectも使用できます。

+0

私はインターフェイスのアイデアが気に入っていますが、その実装方法についてはわかりません。設定にあるプロパティに直接マップするプロパティを持つインターフェイスを持っているか、リンクされているコードと同じ方法でConfigurationManagerを使用していますか?以前はConfigurationManagerを使用していませんでしたので、ここで何をすべきかはあまり分かりません。適切な方向へのもう一つの動きは評価されるだろう。 :) – Andy

+0

'IConfigurationManager'は、外部設定がアプリケーション内にあり、それらをコンテナで処理してクラスに注入したい場合の例です。あなたの 'Settings'クラスについては、' Settings'のパブリックメンバーに最もよくマッチする 'ISettings'インターフェースを作成する傾向があります。ですから、 'Settings'に' ConnectionString'プロパティがあれば、これをインターフェース上のプロパティにしてください。 –

+0

明確にしていただきありがとうございます。 – Andy

2

彼らは、依存関係として渡す必要があります。あなたの例#2のユニットテストを介してその設定のセットを変更したい場合のシナリオを想像してみましょう。静的プロパティゲッターに複雑なスイッチロジックを持っていなければなりません。

多くのIoCコンテナは、あなたのためのクラスを注入する際に、シングルトンの実装を提供することさえできます。

4

I「は、上記のいずれ」を選択しないと直接ブール値を挿入します:

public class Foo 
{ 
    private readonly bool _myBool; 

    public Foo(bool myBool) 
    { 
     _myBool = myBool; 
    } 
} 

これは、ブール値の取得をサポートする任意のインフラの知識からFooを分離します。 Fooには、設定オブジェクトに依存して複雑さを導入する理由はありません。特に、他の無関係な値が含まれている場合は特にそうです。

+0

+1ですが、これはDIコンテナで設定するのがはるかに難しいことに注意してください。しかし、おそらく最高のアイデアです。 – Domenic

+0

@Domenic:一部のDIコンテナでは、他のコンテナと同じように簡単にこれを有効にできない可能性があることは間違いありません。私はAutofacを使用しています。これは登録用のラムダ式をサポートしているため、簡単にプリミティブ値を注入できます。 –

+0

@Bryan:私は同意しますが、上記のコードスニペットは質問の目的のための非常に単純な例として考案されました。しかし、あなたが述べたことは正しかったので、あなたの答えに感謝します。 – Andy