2012-06-19 16 views
5

私は最近、セッションとクエリ文字列からの値の格納と読み取りを含む多くの古典的なASP.NETプロジェクトに参加しました。これは、次のようになります。ASP.NETのDRY原則に続いて、

Session["someKey"]=someValue; 

そして、コードのどこかでセッションの値が読み取られます。明らかに、これはDRYの原則に違反します。文字通りの文字列キーがコード全体に広がっているからです。これを回避する1つの方法は、セッションに読み書きする必要があるあらゆる場面で参照できる定数としてすべてのキーを格納することです。しかし、私はそれがそれを行うための最善の方法であるかどうかはわかりません。 DRYの原則に違反しないように、私はこれを最善に処理することをどのようにお勧めしますか?

答えて

7

例えば

public class SessionVars 
{ 
    public const string SOME_KEY = "someKey"; 
    public const string SOME_OTHER_KEY = "someOtherKey"; 
} 

、その後、どこでも、あなたのコード内で使用すると、このようなセッション変数にアクセスすることができ、あなたの定数を定義することができ、別のパブリッククラスを作成します:あなたが得ることができる

Session[SessionVars.SOME_KEY]=someValue; 

この道をIntelliSenceと他の鐘と笛。

+0

1は、これは私が続く傾向にあるパターンです。 –

+1

この文脈では 'const'を使うべきではありません。 'static readonly'はより適切です(そして安全です)。 – EkoostikMartin

+1

それはどのようにあなた自身を繰り返さないという原則を緩和していますか?どこでも同じ1つのライナーを書いていますが、キーのインスタンス文字列ではなく定数変数を使用していますか? – BlackSpy

2

あなたはDRYをあまりにも読んでいると思います。私は、関数に包まれる可能性のあるものにもっと関連しています。私。同じfives行を繰り返している代わりに、それらの5行を関数内にラップし、必要なときに関数を呼び出します。

例としては、ディクショナリ(ここではセッションオブジェクト)に値を設定するだけです。これは、オブジェクトを格納して取り出す最も簡単な方法です。

+1

... –

0

オプションで、基本ページでこのセッションオブジェクトへのアクセスを配置し、プロパティにそれを包むことができます:

class BasePage : Page 
{ 
    ... 
    public string MySessionObject 
    { 
     get 
     { 
     if(Session["myKey"] == null) 
      return string.Empty; 
     return Session["myKey"].ToString(); 
     } 
     set 
     { 
      Session["myKey"] = value; 
     } 
    } 
    ... 
} 

ここでは、myKey文字列を繰り返しているが、それが財産にカプセル化されます。これを避ける極端な方法を知りたい場合は、キーで定数を作成して文字列を置き換えます。

1

私は謙虚にから、このコードを再目的と私の人生のために覚えていないことができますが、それはかなりいいです。

using System; 
using System.Web; 

namespace Project.Web.UI.Domain 
{ 
    public abstract class SessionBase<T> where T : class, new() 
    { 
     private static readonly Object _padlock = new Object(); 

     private static string Key 
     { 
      get { return typeof(SessionBase<T>).FullName; } 
     } 

     public static T Current 
     { 
      get 
      { 
       var instance = HttpContext.Current.Session[Key] as T; 

       lock (SessionBase<T>._padlock) 
       { 
        if (instance == null) 
        { 
         HttpContext.Current.Session[Key] 
          = instance 
          = new T(); 
        } 
       } 
       return instance; 
      } 
     } 

     public static void Clear() 
     { 
      var instance = HttpContext.Current.Session[Key] as T; 
      if (instance != null) 
      { 
       lock (SessionBase<T>._padlock) 
       { 
        HttpContext.Current.Session[Key] = null; 
       } 
      } 
     } 
    } 
} 

その背後にある考え方2倍に。作成されるタイプは、必要な唯一のタイプである必要があります。これは基本的には強く型付けされたラッパーです。だから、あなたが情報を拡張しておきたいいくつかのオブジェクトを持っています。そして、道をあなたはMyClassを拡張

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

、あなたは、AppSettingsまたは中のConst変数に格納し、すべてのキー値を覚えておく必要がしたくありません静的クラス。

そして、あなたのプログラムのどこにでも簡単にクラスを使用できます。それは実際にそれらの厄介なタイプミスのバグを排除するのに役立ちます -

私は維持するためにあなたの必要性をストリングス*あなたは*魔法の完全なプロジェクトを継承することはありません願っ
// Any Asp.Net method (webforms or mvc) 
public void SetValueMethod() 
{ 
    MyClassSesssion.Current.Blah1 = "asdf"; 
} 

public string GetValueMethod() 
{ 
    return MyClassSession.Current.Blah1; 
} 
関連する問題