2009-03-21 22 views
0

非静的クラスの静的内部クラスのスコープについてはわかりません。ASP.NET内の静的内部クラスのスコープ

変数DataContextCreator.Instance(シングルトンパターンの一部)は、すべてのページオブジェクト/ページ要求の同じPDataContextインスタンスを指しますか、各オブジェクトは独自のインスタンスを持ちますか?

public class Page : System.Web.UI.Page 
{ 

    private class DataContextCreator 
    { 
     static DataContextCreator() { } 

     public static readonly PDataContext Instance = new PDataContext(TUtil.GetConnectionString()); 
    } 

    public PDataContext DataContext 
    { 
     get 
     { 
      return DataContextCreator.Instance; 
     } 
    } 
} 

は、私は、これは所望の方法、すなわち無共有のDataContextに動作するためにHttpContext.Currentと連携する必要がありますか?もしそうなら、別の方法がありますか?

静的なクラスをプライベートに変更するかどうかはわかりません(私が行ったように)。

ありがとうございます!

EDIT: これは私のソリューションで、静的変数を持たずに同じ遅延ロード機能を持つようになりました。この場合、保持変数の周りにmutexロックを置く必要はないと思います。

private PDataContext _DataContext; 
    private PDataContext DataContext 
    { 
     get 
     { 
      if (this._DataContext == null) 
      { 
       this._DataContext = new PDataContext(TUtil.GetConnectionString()); 
      } 
      return this._DataContext; 
     } 
    } 
+0

コードがページにある場合は、ロックの必要はありません。プロパティはページのローカルなので、1つのスレッドだけがそのページにアクセスします。 – Guffa

答えて

2

すべてのページで同じです。静的変数は静的変数ですが、入れ子になっています。 (ジェネリックがFoo<int>のstatic変数などFoo<string>のものとは別の、それはここでは関係ないということで物事「面白い」を作る。)

をあなたが何かをしたい場合はPageのインスタンスに依存し、それが必要Pageのインスタンス変数になるようにします。 (ちなみに、その基本クラスと同じケースに名前を付けることをお勧めします。)

+0

ありがとうございます。インスタンス変数を使ってこれを行うのは簡単だろうということが分かりました。私はシングルトンパターンから来た。しかし、ここでは必要ありません。 – user51710

+0

はい、私は通常、基底クラスの後に派生クラスの名前を付けません。それは既存のクラスであり、他の誰かによって行われました。おそらくそれを変更するには遅すぎることはありません。 – user51710

+0

もし誰かが問題があれば、誰かが私の解決策を最新の編集と投稿ですばやく見ることができるかもしれません。 – user51710

1

ネストされたクラスは純粋に命名上の便宜のためのものです(いくつかの変更子の変更(プライベートなど))。実際には、動作に関して正規の(トップレベル)クラスと同じです。したがってInstanceは完全に共有されています(ページインスタンスに結び付けられていません)。

1

変数は静的であるため、1回だけ存在するため、すべてのスレッドは同じ値を共有します。変数を別のクラスに置いても、静的変数の動作は変わりません。

ページインスタンスに対してローカルであるシングルトンを作成するには、ページ・コンテキストに参照を格納します:

public PDataContext DataContext { 
    get { 
     PDataContext result = HttpContext.Current["PData"]; 
     if (result == null) { 
     result = new PDataContext(TUtil.GetConnectionString()); 
     HttpContext.Current["PData"] = result; 
     } 
     return result; 
    } 
} 
関連する問題