34


8

ASP .NETシングルトン

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

6 Answer


34


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

  • 特定のユーザーとリクエスト間でデータを共有するには、次を使用します HttpContext.Current.Session。

  • 特定のリクエスト内でデータを共有するには、次を使用します HttpContext.Current.Items。

  • アプリケーション全体でデータを共有するには、 そのためのメカニズム、または単一のプロセスで動作し、シングルトンを作成/アプリケーションを使用するようにIISを構成します。

ちなみに、デフォルトのワーカープロセス数は1なので、静的メンバーにはアプリケーション全体のスコープがあると考える人々がいっぱいです。


30


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


15


他の人が述べたように、静的変数はhttps://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net[global単一のリクエストではなく、アプリケーション全体に。]

シングルトンを個々のリクエストのみに対してグローバルにするには、 `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"];
        }
    }
}


4


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


0


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


-3


ユーザーごとのアプリケーション全体のセッション。 単一のASPページのViewState。