5

確かにそれは一般的な問題であるに違いありませんが、これを行う簡単な方法が見つかりません。

ページのすべてのコンポーネントにハンドルを渡すことなく、asp.net Webフォームのライフサイクルを通じてグローバル変数(インスタンス化に費用がかかるクラスなど)を共有する方法はありますか?

静的変数を作成するだけでは、アプリ ドメイン内のすべてのスレッドからアクセスでき (問題: 私のクラスはスレッド セーフではありません)、最新のコピーですべてのページが機能することを確認するのは困難です (キャッシュしたい)ページのライフサイクルのすべてのステップでクラスを変更しますが、新しいページが呼び出されるたびに新しいインスタンスが必要です)。

別の方法として、ページ内の各コントロールを介してハンドルを渡すこともできますが、マスター ページ、ページ自体、およびすべてのユーザー コントロールの間で、コードが非常に複雑になります。

この特定のページ (すべてのサブ ユーザー コントロールを含む) を実行しているスレッドのみがアクセスできる場所にクラスを格納するためのエレガントなソリューションがないかどうか疑問に思っていました。

どんな提案でも大歓迎です! ありがとうチャールズ

4

1 に答える 1

7

簡単な答えがあります。Items コンテナです。単一のリクエストの存続期間中は利用可能で、その後は自動的に破棄されます。プロパティでラップして、必要なものを取得できます。

 public class Foo {

   const string SOMEKEY = "_somekey";

   public static string SingleRequestVariable
   {
      get
      {
          return (string)HttpContext.Current.Items[SOMEKEY];   
      }
      set
      {
          HttpContext.Current.Items.Add( SOMEKEY, value );
      }
   }
 }

その後

Foo.SingleRequestVariable = "bar"; // somewhere
...
string val = Foo.SingleRequestVariable; // yet somewhere else
于 2012-08-04T17:02:52.743 に答える