2010-12-31 5 views
1

.NET設定メカニズムを参照して、this質問への回答のいくつかに触発されて、別のラッパークラス(おそらくシングルトン)を介して設定の使用をラッピングする人がいるようです。設定を直接使用するか、ラッパークラスを使用しますか?

設定クラスは既にシングルトンではありませんか?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] 
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 

    public static Settings Default { 
     get { 
      return defaultInstance; 
     } 
    } 
// rest of class... 
} 



。代わりに、必要な場合、直接これを行うの

int foo = MySettingsWrapper.MyInt; 

:依存性注入の

int foo = Settings.Default.MyInt; 

答えて

2

Settingsクラスは、シングルトンそのものではありません。あなたは何ができる:しかし

var s1 = new Settings(); 
var s2 = new Settings(); 
var s3 = new Settings(); 

s1s2s3の知る限り値が全て同じ場所に永続化されるので、私は、それはあなたがあまり良くないだろうと考えている。

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>\user.config

だから私は疑う:

s1.MyInt = 1; 
s1.Save(); 

0と同じになります
s2.MyInt = 1; 
s2.save(); 

この理由から、Settings.Defaultという静的プロパティを取得すると、スレッドセーフなインスタンスが1つ返されます。私はそれをそのまま使用しますが、それを包む理由はありません。しかし、あなたはuser.configの位置を制御したい場合には、例えば、にそれを拡張したい場合があります:How to make designer generated .Net application settings portable

1

そのタイプ
ので、別のクラスに設定をラッピングしてこれを行うことの利点は何ですか。

Settings.Defaultは、設定メカニズムの実装の1つのタイプです。

ラッパーを追加すると、インプリメンテーションコードはコード全体ではなく1か所に配置されます。

コードを変更することなく、別の実装のためにそのファイルを簡単に交換することができます。

オーバーキル可能です。その実装を交換する必要があるかどうかを判断する必要があります。しかし、それについて考えてみると、これらの設定にアクセスする必要のある他のシステム(SQLジョブ、リモートサービスなど)をさらに詳しく調べることができます。

通常、この「ラッパー」はインターフェイスの実装であり、コントロールコンテナ(たとえばCastle.Windsor)の逆アセンブリを使用して、実行環境にインプリメンテーションを注入します。

0

私はインターフェイスベースのクラスと設定クラスをラップする主な利点は、ユニットテストに役立つていると思います。ファイルI/O、設定ファイルの場所の問題を回避し、依存性注入を有効にします。

関連する問題