2008-09-15 42 views
3

私は共通のヘルパークラスを共有するいくつかのASP.NET Webサービスを持っており、サーバーあたりのインスタンスをインスタンス化する必要があります。これはデータの単純な変換に使用されますが、起動時にweb.configファイルなどからロードする時間があります。ヘルパークラスは100%スレッドセーフです。ユーティリティコールの単純なライブラリと考えることができます。私はすべてのメソッドをクラスで共有するつもりだが、私はweb.configから初期設定をロードしたい。 IIS 6.0にWebサービスを展開し、15人のWebガーデンを持つアプリケーションプールを使用しました。要求ごとにGlobal.asaxの共有/静的変数が分離されていますか?

私は、Global.asaxのプライベート共有変数としてヘルパークラスを宣言し、このような怠惰な負荷共有の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")の両方を使って同様のことを試みましたが、依然として各リクエストでコンストラクタが実行されていました。

答えて

0

アプリケーションの状態を絶対に必要としない限り、アプリケーションの状態を使用することは賢明ではありません。要求ごとのオブジェクトを使用すると、はるかに簡単です。ヘルパークラスに状態を追加すると、あらゆる種類の微妙なエラーが発生する可能性があります。 HttpContext.Currentアイテムコレクションを使用し、要求ごとにそれを初期化します。 VBモジュールはあなたが望むことをしますが、ステートフルなものにしないでください。

+0

高価なオブジェクトがすべての要求に対して再作成することは非常に悪い考えです。トラフィックが少ないサイトでも、サーバーに負荷がかかると動作します。 – JRoppert

0

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

いいえそこには隔離されていません。

3

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

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

あなたはそのようにヘルパーを使用することができます。これは、起動アプリケーション上で作成し、アプリケーションの状態に住んでいるされてMyHelperClassクラスの単一のインスタンスになり

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

を。インスタンスはApplication_Startで作成されるため、これはHttpApplicationインスタンスごとに1回だけ発生し、要求ごとには発生しません。

+0

これは、すべての単一リクエストで新しいオブジェクトをインスタンス化します。私はBobがサーバーごとに1つのオブジェクト*を取得しようとしていると思います。 –

+0

それは正確です。 –

+1

マイケル - これは、すべてのリクエストで新しいオブジェクトをインスタンス化するとは思わない。オブジェクトはアプリケーションの開始時に1回だけ作成されます。 2番目の部分は、既存のオブジェクトを指すようにオブジェクト変数を割り当てるだけです。オブジェクト全体のインスタンスは1つしかありません。 –

関連する問題