2012-02-17 4 views
0

내 응용 프로그램에서 내 프로젝트 전체에서 액세스 할 수있는 모든 전역 값을 보유하는 Constants이라는 정적 클래스가 있습니다. Constants의 섹션 그래서 다음과 같습니다코드 디자인, 정적 상수 할당

internal static class Constants 
    { 
     internal static DateTime FromDate = new DateTime(2011, 10, 1); 
     internal static DateTime ToDate = new DateTime(2011, 10, 31); 
     internal static decimal TaxRate = 20m; 
    } 

그러나 지금 TaxRate은 데이터베이스에서 동적으로 액세스 할 수있다 (그리고 후속 저장소의 인스턴스를 통해 사용할 수 있습니다). 그러나 정적 생성자가 매개 변수를 가질 수 없기 때문에 어떻게이 작업을 수행 할 수 있습니까?

내가 그것을 유지하기 위해 Constants 싶습니다은 동일한 속성입니다 :

  • 그것은, 따라서 인스턴스화 할 수없는 정적 그리고이 서로 다른 버전의
  • 그것은 속성
(때문에 const 수정의) 수정할 수 없습니다입니다
  • 그러나 참조 개체에서 처음으로 TaxRate을 설정할 수도 있습니다.

    이것을 달성하는 데 가장 좋은 디자인은 무엇입니까?

  • +0

    http://stackoverflow.com/questions/2687403/c-sharp-static-constructors-design-problem-need-to-specify-parameter 참조 개체는 어떤 유형입니까? dbms 또는 config 파일에 저장할 수 있습니까? –

    +0

    먼저 내 마음에 들어오는 것이이 .. 내부 정적 십진수 TaxRate {get; 개인 집합} .. 그래서 당신은 값을 얻을 수 있지만 설정할 수 없습니다. 응용 프로그램 시작시 반영을 통해 TaxRate를 설정할 수 있습니다. –

    +0

    리포지토리 개체입니다. 특별한 것은 아닙니다. –

    답변

    3

    대신 "정적"클래스를 사용하는 대신 클래스의 사용 범위가있는 IoC 컨테이너를 Singleton() 사용법으로 사용하거나 Constants 클래스에 대한 단순 패턴을 구현하는 것이 좋습니다. 그런 다음 클래스의 속성을 private setter가있는 공용 getter로 설정하면 ... initialize() 메서드를 호출하여 필요한 정보를 데이터베이스에서 가져올 수 있지만 나머지 코드는 속성의 값에 영향을줍니다.

    예컨대 :

    public class Constants 
    { 
        static Constants instance; 
        public static Constants Instance 
        { 
         get 
         { 
          if (instance == null) 
          { 
           instance = new Constants(); 
           instance.Initialize(); 
          } 
         } 
        } 
    
        public void Initialize() 
        { 
         // db logic here to populate db recorded fields. 
        } 
    
        private Constants() 
        { 
        } 
    
    } 
    
    +0

    공개적으로 "getters"가 읽기 전용이 아닌 이상 계속해서 나는 그 값에 대한 생각을 바꿀 수는 없을 것이다.하지만 나는 항상 규칙을 지켰다. 내가 정적 클래스라고 불렀다면, 나는 그 값들을 변경하려고 시도하지 않을 것입니다. 단지 그것이 얼마나 방어적인 것인지 확실하지 않습니다. –

    0

    당신은 그 개인이 아닌 모든 속성이 아닌 인스턴스 변수를 만들 수 있습니다. 그런 다음 다른 곳에서 수정할 수 없도록 setter없이 getter를 제공 할 수 있습니다.

    복잡한 초기화의 경우 지연 제거를 사용할 수 있습니다 (스레드를 안전하게 만드는 경우). 개인 변수가 설정되지 않았 으면 설정하고, 초기화하지 않으면 초기화하십시오.