22

したがって、シングルトンパターンを使用するオブジェクトは、インスタンスを1つだけ持つことができます。これはWebサイトでどのように機能しますか?

質問:

  1. シングルトンオブジェクトは、Webサイトの各クライアント/訪問者に固有ですか?つまり、シングルトンオブジェクトはクライアントごとに1つのインスタンスを取得しますか?
  2. Webアプリケーションのオブジェクトは数秒間しか持続しないため、2つのクライアントが同時にWebサイトにアクセスすると、両方のクライアントがシングルトンオブジェクトを作成しようとします。これは、訪問者に表示される例外がスローされることを意味しますか?グーグルを試しましたが、直接の答えが見つかりませんでした。私はちょっとした説明を探しています。
4

5 に答える 5

9

スティーブ、私はあなたの質問のそれぞれに答えようとします:

1)Web開発の場合、オブジェクトをWebリクエストにスコープすることは非常に一般的です(これは「リクエストごとのコンテキスト」または「httpコンテキストごと」とも呼ばれます)が、通常、これらをシングルトンとは呼びません。その正確な理由。実際、ほとんどのIOCコンテナーには、「シングルトン」だけでなく、箱から出してすぐに組み込まれた「Web要求ごと」のスコープがあります。

2)Webアプリケーションにも真のシングルトンが存在することがよくあります(すべての要求によってアクセスされます)。上記のように、これは完全には当てはまりません。これは、スコープがアプリプールに限定され、アプリプールが再起動されたときに吹き飛ばされるためです。ただし、これはWebアプリケーションの目的ではシングルトンです。Jigarが述べたように、ロギングなどの「横断的関心事」がこのように設定されることがあります。これらは通常、各Webリクエストで初期化されるのではなく、global.asaxで初期化されるか、IOCコンテナに依存して初期化されます。オブジェクトの作成を実行するときは、標準のロックパターンの1つを使用して、2つのスレッド/クライアントなどが同時にオブジェクトを作成しないようにする必要があります。これがMicrosoftからのリンクですが、他にも実装があります。 http://msdn.microsoft.com/en-us/library/ff650316.aspx 人気のあるIOCコンテナーのいずれかを使用している場合は、これを処理します(Structuremap、Windsor、Autofac、Unity、Ninject ...および他の多くの)。

どちらも特定の状況で有効であり、非常に一般的であるため、どちらのアプローチを参照しているかを同僚に尋ねる必要があります。

于 2012-07-06T13:17:39.513 に答える
2

それはすべて、シングルトンの実装に依存します。ここでは、静的コンストラクターで初期化された静的フィールドとしてシングルトンを作成すると仮定します。

理論的には、その設定に応じて、IISはアプリケーション用に複数のプロセスを作成する場合があり、各プロセスは要求を処理するための複数のスレッドを作成できます。各プロセスには独自のシングルトンがあり、複数のスレッド(および複数のリクエスト)で共有できます。ただし、同時に、1つのサーバー上に「シングルトン」(プロセスごとに1つ)のインスタンスが複数存在する可能性があります(ただし、正しく理解していれば、IIS設定で複数のプロセスを禁止できます)。

静的コンストラクターを使用する場合、スレッドセーフな方法でクラスへの最初のアクセス時にシングルトンが作成されます。C#静的コンストラクタースレッドは安全ですか?を参照してください。

シングルトンの作成はスレッドセーフですが、それでもシングルトンクラスの内部をスレッドセーフな方法で実装する必要があります。

シングルトンは、アプリケーションプロセスが存続し、再起動されない間存続します。アプリケーションプロセスの存続期間はIISによって管理されるため、長時間または非常に短時間になる可能性があります。

于 2012-07-06T13:18:19.243 に答える
1

シングルトンはIISによって維持されるため、シングルトンはIISアプリケーションプールの間だけ存続します。これがリサイクルされるか、IISがリセットされると、シングルトンは消えます。マルチアクセスにはシングルトンをロックする必要があります。他のクライアントサーバーアプリと同じように。

Webサイトが本質的にステートレスなクライアントサーバーアプリであるという考えに反するので、一般的には避けようとします。Sessionを使用して共有データを保存しないのはなぜですか?

于 2012-07-06T12:42:25.467 に答える
0

ロガーと共有リソースの場合は、確かにWebアプリでシングルトンを使用できます。Liamが述べたように、アプリケーションプールがクリアされない限りそれらは残ります。

理解を深めるには、次のWebサイトにアクセスしてください... http://www.oodesign.com/singleton-pattern.html

ありがとう

于 2012-07-06T12:44:54.560 に答える
-1
public class SingletonContext<TContext>
    where TContext: DbContext,new()
{
    private static TContext _context;

    private SingletonContext()
    {

    }
    public static TContext GetInstance()
    {
        if (_context == null)
        {
            _context = new TContext();
        }
        return _context;
    }

}
于 2018-02-08T08:15:04.983 に答える