遵循ASP.NET中的DRY原则

时间:2012-06-19 21:43:31

标签: c# asp.net dry

我刚刚参与了一个经典的ASP.NET项目,其中包含来自会话和查询字符串的大量存储和读取值。这可能类似于以下内容:

Session["someKey"]=someValue;

在代码中的其他位置读取会话中的值。显然,这违反了DRY原则,因为您将在整个代码中分散文字字符串键。避免这种情况的一种方法是将所有键存储为可在任何需要读取和写入会话的地方引用的常量。但我不确定这是最好的方法。您如何建议我最好处​​理这个问题,以免我违反DRY原则?

4 个答案:

答案 0 :(得分:7)

创建一个单独的公共类,您可以在其中定义常量,例如

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

然后代码中的任何位置都可以访问会话变量,如下所示:

Session[SessionVars.SOME_KEY]=someValue;

通过这种方式,您可以获得IntelliSence和其他花哨的功能。

答案 1 :(得分:2)

我觉得你在读DRY太多了。我更关注可以包含在函数中的东西。即而不是在整个地方重复相同的五行,而是在函数中包裹这5行,并在任何需要的地方调用函数。

您所拥有的只是在字典中设置一个值(在这种情况下是会话对象),这是在其中存储和检索对象的最简单方法。

答案 2 :(得分: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;
                }
            }
        }
    }
}

背后的想法是两折。创建的类型应该是您需要的唯一类型。它基本上是一个强大的强类型包装器。所以你有一些想要继续扩展信息的对象:

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;
}

答案 3 :(得分:0)

您可以选择将此会话对象的访问权限放在基页中并将其包装在属性中:

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

在这里,您重复myKey字符串,但它被封装到属性中。如果您想要避免这种情况,请使用键创建一个常量并替换字符串。