2

シングルトンクラスのインスタンスを格納するのに最適な場所はどこですか?たとえば、構成クラス(アプリケーションのグローバル設定をロードする)と、おそらくWebサービスにアクセスするクラスがある場合、これらをインスタンス化して保持するのに最適な場所がわかりません。

現在、私はそれらをProgramクラス(Application.Runが呼び出される場所)のインスタンスとして持っており、正常に機能しているようですが、それが最良の方法かどうかはわかりません!...

static class Program
{
    public static string dbConnectString = "Data Source=" + 
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + 
        @"\xxx.sdf" + ";Persist Security Info=False";
    public static Settings settings = null;

    [MTAThread]
    static void Main()
    {
        settings = Settings.Instance;
        Application.Run(new MainMenu());
    }
}

そして、アプリケーション全体を通して、私はそれを次のように呼んでいます:

txtWebServiceUrl.Text = Program.settings.getSetting("web_service_url");

これに何か問題がありますか、それとも最善の方法は何ですか?ありがとう!

4

2 に答える 2

3

私は個人的に、'emを素晴らしく簡単に取得できるようにします-'emを'Settings'または'Global'クラスに入れます。ああ、可能であれば、文字列キーではなく設定にアクセスするためのプロパティ[または列挙型]を用意して、タイプミスをしたときにインテリセンスが頭を悩ませることができるようにします。

public static class Settings
{
    static Dictionary<string,string> data = new Dictionary<string,string>();

    public static string WebServiceUrl {get {return data["web_service_url"];}}
}

そのように使用されます:

 txtWebServiceUrl.Text = Settings.WebServiceUrl;

明らかにこれはオプションですが。

お役に立てば幸いです。

于 2012-07-16T00:45:56.373 に答える
1

シングルトンパターンのポイントが欠落しています。シングルトンによって制御される単一の参照のみを対象としているため、シングルトンへの参照は保存しません。

このパターンは、シングルトンを使用する必要がある場所であればどこでも機能し、単一のインスタンス(この場合はSettings.Instance)を介して参照します。

シングルトン自体は、本質的に制御の反転を壊し、コードのテストをより困難にするという点で、少し匂いがします。シングルトンと静的クラスに遭遇したレガシーアプリケーションでは、インターフェイスを拡張するためにそれらを変更する傾向があります。(つまり、ISettings)目的の動作を公開し、それにアクセスするクラスへの遅延読み込み依存関係のようなものを利用します。

private ISettings _settings;
public ISettings Settings
{
  get { return _settings ?? Settings.Instance;}
  set { _settings = value; }
}

これにより、テストで設定をスタブ/モックに置き換えることができます。デフォルトはシングルトンです。これは効果的で軽量なリファクターであり、シングルトンとスタティックに依存するコードである程度の妥当性を実現します。

于 2012-07-16T04:51:08.323 に答える