2011-12-28 5 views
2

私は基本Webページを持ち、すべてのaspxページを継承しています。私はベースページに入れて、それがすべての継承aspxページで利用できるようにいくつかの一般的なメソッドを持っています。グローバルWebサイトの設定にシングルトンインスタンスまたはスタティックインスタンスを使用するには

私は、この基本Webページで自分のウェブサイトの設定を取得するプロパティを1つ持っています。これは、アプリケーション全体のレコードです。キャッシュに保存しています。

BaseWebPage.csプロパティ

//website settings 
public USP_GETWEBSITESETTINGSDETAILS WEBSITESETTING 
{ 
    get 
    { 
     USP_GETWEBSITESETTINGSDETAILS aWebsiteDetails = null; 
     if (Cache["websettings"] != null) 
     { 
      aWebsiteDetails = (USP_GETWEBSITESETTINGSDETAILS)Cache["WEBSITESETTINGSDETAILS"]; 
     } 
     else 
     { 
      aWebsiteDetails = GetWebsitesettingsDetails(); 
      Cache["websettings"] = aWebsiteDetails; 
     } 
     return aWebsiteDetails; 
    } 
    set 
    { 
     Cache["websettings"] = (USP_GETWEBSITESETTINGSDETAILS)value; 
    } 
} 

私が何をしたいのか、私は他のページに共通の設定にアクセスできるように、

BaseWebPage.StaticInstance.WEBSITESETTINGのようなものです。

私はこのBaseWebPage.cs内の他の性質を持って覚えているが、その他

CURRENT_USERIDCURRENT_USERNAMECURRENT_USER_FULLNAME、のようなファイル彼らは値がセッションに格納されている以外は、上記の特性に似ています。たとえば:

public int CURRENT_USERID 
{ 
    get 
    { 
     int iID = 0; 
     if (Session["MYUSERID"] == null) 
      iID = 0; 
     else 
      Int32.TryParse(Session["MYUSERID"].ToString(), out iID); 
     return iID; 
    } 
    set 
    { 
     Session["MYUSERID"] = (int)value; 
    } 
} 

私はシングルトンと静的クラスについて読み、まともな知識を持っているが、それは非常に良いアーキテクチャを持つように適切な方法で使用され得ることについてではない100%確認しています。

私はBaseWebPage.cs

// Singleton instance of this class 
public static readonly BasePage StaticInstance = new BasePage(); 

に線の下に追加して、私が取得/設定用のBaseWebPage.StaticInstance.CURRENT_USERIDにアクセスするとき、それはアプリケーション全体のための単一のコピーになるだろうか、私が保管していて、それが一意になる場合それはセッションで?

ありがとうございます。他の良い選択肢があれば、私のアーキテクチャを改善してください。

答えて

1

asp.netの静的クラスの有効範囲はグローバルで、アプリケーションオブジェクトに似ています。 セッションにかかわらず、asp.netウェブサイトのすべてのセッションで常に同じインスタンスにアクセスします。

シングルトンインスタンスを作成するには、静的読み取り専用を使用しないでください。代わりに、あなたは以下のようなものを持つことができます。スレッドセーフです。

//sample code 
public sealed class BaseWebPage : Page 
{ 
static BaseWebPage instance=null; 
static readonly object padlock = new object(); 

BaseWebPage() 
{ 
} 

public static BaseWebPage Instance 
{ 
    get 
    { 
     if (instance==null) 
     { 
      lock (padlock) 
      { 
       if (instance==null) 
       { 
        instance = new Singleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

// ...他のコード }

次に任意のページで、あなたは

BaseWebPage.Instanceにアクセスすることができます。WEBSITESTING、それは全体のアプリケーションのための単一のコピーになります。

私はこのタイプのコードを使用しており、とてもうまく機能しました。

+0

よくシングルトンクラスを作成する方法がいくつか見つかっていますが、私はそれを使うべきか、静的なアプローチか他の方法をとるべきかについての良い提案に興味があります。 BaseWebPage.csにいくつかのパブリックメソッドがあり、前述のように私のaspxページのすべての親ですので、私はそれを 'sealed abstract'にすることはできません –

3

BasePageクラスはシングルトンである必要はありません。それを普通の(おそらく抽象的な)クラスにしておき、それらのプロパティが存在するようにして継承を使用するだけです。

+0

私はそれを知っていますが、あなたが示唆していることは役に立ちません。私はBaseMasterPage.csといくつかの他の子のマスターページを持っています。ベースマスターはBaseWebPage.csから継承されていないので、BaseMasterPage.csからBaseWebPageのパブリックプロパティにアクセスする必要がある場合は、インスタンス化する必要がありますが、それはユーザーごとのオブジェクト(新しいセッションごと)になりますしたくない。 –

+0

これは必須ではありません。これらのプロパティは静的でもかまいませんが、クラスは必ずしもそうである必要はありません。 – hunter

1

以前はシングルトンパターンを何度も使用していましたが、Webでは使用できませんでした。なぜあなたはあなたのプロパティのいくつかでそれをやっているようにセッションを使用しないでください?セッションは、アプリケーション全体に対して、ほぼ1つのインスタンスです。いずれにせよ、Hereは、Microsoftのベストプラクティスを見ることができます。繰り返しますが、私はウェブサイトのためにシングルトンを全く勧めません。

幸運を祈る!

関連する問題