3

サーバーごとに1つのインスタンスをインスタンス化するだけでよい共通のヘルパークラスをすべて共有するASP.NET Webサービスがいくつかあります。これはデータの単純な変換に使用されますが、起動時に web.config ファイルなどからの読み込みに時間がかかります。ヘルパー クラスは 100% スレッド セーフです。ユーティリティ呼び出しの単純なライブラリと考えてください。すべてのメソッドをクラスで共有したいのですが、web.config から初期構成をロードしたいと考えています。IIS 6.0 に Web サービスを展開し、アプリケーション プールを使用して、15 ワーカーの Web ガーデンを使用しました。

Global.asax でヘルパー クラスを Private Shared 変数として宣言し、次のように遅延読み込み Shared ReadOnly プロパティを追加しました。

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

のコンストラクターにログ記録コードがありMyHelperClass()、同じスレッドであっても、リクエストごとにコンストラクターが実行されていることが示されます。ASP.NET のいくつかの重要な詳細が欠けているだけだと思いますが、MSDN はあまり役に立ちませんでした。

Application("Helper")と の両方を使用して同様のことを試みましCache("Helper")たが、各リクエストでコンストラクターが実行されるのを見ました。

4

3 に答える 3

3

ヘルパーをアプリケーション状態にすることができます。global.asax でこれを行います。

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

その方法でヘルパーを使用できます。

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

これにより、アプリケーションの開始時に作成され、アプリケーションの状態にある MyHelperClass クラスの単一のインスタンスが生成されます。インスタンスは Application_Start で作成されるため、これは Request ごとではなく、HttpApplication インスタンスごとに 1 回だけ発生します。

于 2008-09-15T13:36:12.003 に答える
0

どうしても必要な場合を除いて、アプリケーションの状態を使用することは賢明ではありません。リクエストごとのオブジェクトを使用することに固執すると、状況ははるかに簡単になります。ヘルパークラスに状態を追加すると、あらゆる種類の微妙なエラーが発生する可能性があります。HttpContext.Currentアイテムコレクションを使用して、リクエストごとに初期化します。VBモジュールは必要なことを実行しますが、ステートフルにしないように注意する必要があります。

于 2008-09-15T13:46:13.303 に答える
0

過去に自分のアプリでこのようなことをしたことがあり、あらゆる種類の奇妙なエラーが発生しました。すべてのユーザーは、プロパティ内の他のすべてのユーザーのデータにアクセスできます。さらに、1 人のユーザーがそれを使用している最中に、別のユーザーから要求されたために切断されてしまう可能性があります。

いいえ、孤立していません。

于 2008-09-15T13:34:57.293 に答える