2012-06-19 2 views
5

저는 방금 세션과 쿼리 문자열에서 많은 값을 저장하고 값을 읽는 고전적인 ASP.NET 프로젝트에 참여했습니다. 이것은 다음과 같을 수 있습니다 :ASP.NET의 DRY 원칙에 따라

Session["someKey"]=someValue; 

그리고 코드의 다른 곳에서 세션의 값을 읽습니다. 분명히 이는 코드 전체에 리터럴 문자열 키가 분산되어 있기 때문에 DRY 원칙을 위반합니다. 이를 방지하는 한 가지 방법은 모든 키를 상수로 저장하여 세션에 읽고 쓸 필요가있는 모든 곳에서 참조 될 수 있습니다. 하지만 그게 최선의 방법이라고 확신하지 못합니다. 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

이 문맥에서'const'를 사용하면 안됩니다. '정적 읽기 전용'이 더 적절하고 안전합니다. – 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; 
       } 
      } 
     } 
    } 
} 

뒤에 아이디어 두 배. 생성 된 유형이 필요한 유일한 유형이어야합니다. 기본적으로 강력하게 유형화 된 래퍼입니다. 그래서 당신은 당신이 정보를 확장 유지하려는 일부 개체가 : 그런 길 아래에 당신이 MyClass을 확장

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

당신은 appSettings는 또는 헌장 변수에 저장, 모든 키 값을 기억하고 싶지 않아요 정적 클래스.

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