web-dev-qa-db-ja.com

ASP .NETシングルトン

ASP .Net Webアプリケーションにシングルトンパターンを実装する場合、静的変数のスコープは現在のユーザーセッションのみに適していますか? 2番目のユーザーが別のメモリスコープであるサイトにアクセスしています...?

37
Wesly

静的変数のスコープはアプリドメイン全体に対するものです。つまり、他のセッションもそれにアクセスできます。異なるサーバーを持つファームがある場合のみ、変数のインスタンスが複数存在します。

34
Otávio Décio

静的メンバーのスコープは現在のワーカープロセスのみであり、他の要求が必ずしも同じワーカープロセスで処理されるとは限らないため、ユーザーとは何の関係もありません。

  • 特定のユーザーとリクエスト間でデータを共有するには、HttpContext.Current.Sessionを使用します。
  • 特定のリクエスト内でデータを共有するには、HttpContext.Current.Itemsを使用します。
  • アプリケーション全体でデータを共有するには、そのためのメカニズムを作成するか、IISを構成して単一のプロセスを処理し、シングルトンを作成してアプリケーションを使用します。

ちなみに、ワーカープロセスの既定の数は1であるため、静的メンバーにはアプリケーション全体のスコープがあると考える人でWebがいっぱいになります。

35

他の人が述べたように、静的変数は 単一のリクエストではなくアプリケーション全体にグローバルです

シングルトンを個々のリクエストのみにグローバルにするには、HttpContext.Current.Items辞書。

public class Singleton
{
    private Singleton() { }

    public static Singleton Instance 
    {   
        get
        {
            if (HttpContext.Current.Items["yourKey"] == null)
                HttpContext.Current.Items["yourKey"] = new Singleton();
            return (Singleton)HttpContext.Current.Items["yourKey"];
        }
    }
}
15
Dan Herbert

ユーザーベースまたはセッションベースにする必要がある場合は、次のリンクを確認してください。そうでなければ、オタビオが言ったように、シングルトンはドメイン全体で利用可能です。

http://samcogan.com/singleton-per-asp-net-session/

4
NotMe

シングルトンはアプリケーションドメイン全体で使用されます。ユーザーセッション関連のデータを保存する場合は、その目的のために設計されたHttpContext Sessionを使用します。もちろん、操作しようとしているデータを処理するキーと値のペアの方法を考え出すには、おそらくクラス構造を再設計する必要があります。

0
Tomas Vana