2012-06-19 14 views
5

Tôi vừa mới tham gia vào một dự án ASP.NET cổ điển có chứa rất nhiều giá trị lưu trữ và đọc từ chuỗi phiên và truy vấn. Điều này có thể trông giống như sau:Theo nguyên tắc DRY trong ASP.NET

Session["someKey"]=someValue; 

Và một nơi khác trong mã giá trị trong phiên được đọc. Rõ ràng điều này vi phạm nguyên tắc DRY vì bạn sẽ có khóa chuỗi chữ cái trải rộng trên toàn bộ mã. Một cách để tránh điều này có thể là lưu trữ tất cả các khóa dưới dạng hằng số có thể được tham chiếu ở mọi nơi có nhu cầu đọc và ghi vào phiên. Nhưng tôi không chắc đó là cách tốt nhất để làm điều đó. Làm thế nào bạn đề nghị tôi xử lý tốt nhất điều này để tôi không vi phạm nguyên tắc DRY?

Trả lời

7

Tạo một lớp riêng biệt nào mà bạn có thể định nghĩa các hằng số của bạn, ví dụ:

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

và sau đó bất cứ nơi nào trong mã của bạn, bạn có thể truy cập các biến session như thế này:

Session[SessionVars.SOME_KEY]=someValue; 

Bằng cách này bạn có thể nhận được IntelliSence và các chuông và còi khác.

+0

1 Đây là mô hình tôi có xu hướng đi theo - nó thực sự giúp loại bỏ những lỗi typo pesky. –

+1

Bạn không nên sử dụng 'const' trong ngữ cảnh này. 'readonly tĩnh' là thích hợp hơn (và an toàn). – EkoostikMartin

+1

Làm thế nào để giảm bớt nguyên tắc không lặp lại chính mình? Bạn vẫn viết cùng một lớp lót ở khắp mọi nơi, bạn chỉ sử dụng một biến không đổi thay vì một chuỗi ký tự cho khóa? – BlackSpy

2

Tôi nghĩ bạn đang đọc quá nhiều vào DRY. Tôi liên quan nhiều hơn đến những thứ có thể được bọc trong một chức năng. I E. thay vì lặp lại các dòng tương tự trên khắp nơi, hãy quấn 5 dòng đó vào một hàm và gọi hàm ở mọi nơi bạn cần.

Những gì bạn có làm ví dụ chỉ là đặt giá trị trong từ điển (đối tượng phiên trong trường hợp này), và đó là cách đơn giản nhất để lưu trữ và truy xuất đối tượng trong đó.

+1

Chúc các bạn không bao giờ thừa hưởng một dự án đầy đủ các * ma thuật * chuỗi cần bạn để duy trì ... –

0

Tùy chọn bạn có thể đặt quyền truy cập vào đối tượng session này trong một trang cơ sở và bọc nó trong một tài sản:

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

Ở đây bạn đang lặp lại những chuỗi myKey nhưng nó được đóng gói vào bất động sản. Nếu bạn muốn đi đến cùng cực của việc tránh điều này, hãy tạo một hằng số với khóa và thay thế chuỗi.

1

Tôi không thể nhớ cho cuộc sống của tôi, nơi tôi khiêm tốn lại có mục tiêu mã này từ, nhưng nó khá đẹp:

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

Ý tưởng đằng sau nó hai lần. Loại được tạo nên là loại duy nhất bạn cần. Về cơ bản nó là một trình bao bọc mạnh mẽ. Vì vậy, bạn có một số đối tượng bạn muốn tiếp tục mở rộng thông tin trong:

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

Sau đó xuống đường bạn mở rộng MyClass và bạn không muốn phải nhớ tất cả các giá trị Key, lưu trữ chúng trong AppSettings hoặc biến Const trong Lớp tĩnh. Bạn chỉ cần xác định những gì bạn muốn lưu trữ:

public class MyClassSession : SessionBase<MyClass> 
{ 
} 

Và ở bất cứ đâu trong chương trình, bạn chỉ cần sử dụng lớp học.

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

public string GetValueMethod() 
{ 
    return MyClassSession.Current.Blah1; 
}