5

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

Session["someKey"]=someValue;

そして、コードのどこかで、セッションの値が読み取られます。リテラル文字列キーがコード全体に分散されるため、これは明らかにDRYの原則に違反します。これを回避する1つの方法は、セッションの読み取りと書き込みが必要なすべての場所で参照できる定数としてすべてのキーを格納することです。しかし、それが最善の方法かどうかはわかりません。DRYの原則に違反しないように、これを最も適切に処理することをどのように推奨しますか?

4

4 に答える 4

7

定数を定義できる別のパブリッククラスを作成します。例:

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

次に、コード内のどこからでも、次のようなセッション変数にアクセスできます。

Session[SessionVars.SOME_KEY]=someValue;

このようにして、IntelliSenceやその他のベルやホイッスルを入手できます。

于 2012-06-19T21:51:00.700 に答える
2

DRYを読みすぎていると思います。私は、関数にまとめることができるものにもっと関係しています。つまり、同じ5行をあちこちで繰り返す代わりに、それらの5行を関数でラップし、必要な場所で関数を呼び出します。

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

于 2012-06-19T21:49:39.780 に答える
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 つあります。作成されたタイプは、必要な唯一のタイプである必要があります。基本的には、強く型付けされた大きなラッパーです。したがって、情報を拡張し続けたいオブジェクトがあります。

public class MyClass
{
    public MyClass()

    public string Blah1 { get; set; }
}

次に、拡張する道をMyClassたどり、すべてのキー値を覚える必要はなく、静的クラスの AppSettings または Const 変数に格納します。保存するものを定義するだけです。

public class MyClassSession : SessionBase<MyClass>
{ 
}

プログラムのどこでも、クラスを使用するだけです。

// Any Asp.Net method (webforms or mvc)
public void SetValueMethod()
{
  MyClassSesssion.Current.Blah1 = "asdf";
}

public string GetValueMethod()
{
  return MyClassSession.Current.Blah1;
}
于 2012-06-19T21:58:49.700 に答える
0

必要に応じて、このセッション オブジェクトへのアクセスをベース ページに配置し、プロパティでラップすることができます。

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

ここでは文字列を繰り返していmyKeyますが、プロパティにカプセル化されています。これを極限まで回避したい場合は、キーで定数を作成し、文字列を置き換えます。

于 2012-06-19T21:55:36.307 に答える