2012-05-03 2 views
2

코드에서 ConfigurationPropertyAttribute 이름을 세 번 반복하면 정말 귀찮습니다.
맞춤법 오류나 놓기/붙여 넣기 속성을 놓치기 쉽고 이름의 한 인스턴스를 업데이트하는 것을 잊어 버리기 쉽습니다.ConfigurationPropertyAttribute를 사용하여 속성 이름을 3 번 반복하지 마십시오.

상수 선언은 이러한 문제 중 하나만 해결합니다. 더 좋은 방법이 있습니까?

나는 반사를 시도했지만, 속성을 열거하는 것이 훨씬 더 어려워 보이고 더 못 생겼습니다. 내가 DRY 알고

[ConfigurationProperty("port", DefaultValue = (int)0, IsRequired = false)] 
[IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)] 
public int Port 
{ 
    get 
    { 
     return (int)this["port"]; 
    } 
    set 
    { 
     this["port"] = value; 
    } 
} 

그냥 원칙 자주, 현실 세계에서, 원칙은 실용주의에 방법을 제공해야합니다. 그러나 누군가가 더 깨끗한 방법을 가지고 있다고 확신합니까?

답변

3

원하는 경우 구성 요소에 대해 선언적이 아닌 방식을 사용할 수 있습니다. 인터넷을 통해 예제를 찾을 수 있습니다 (예 : Unraveling the Mysteries of .NET 2.0 Configuration). 두 예제를 동시에 표시 할 수 있습니다.

class MyConfigurationElement : ConfigurationElement 
{ 
    private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection(); 
    private static ConfigurationProperty _portProperty = new COnfigurationProperty("port", .....); // Will leave as example for you to add validator etc. 

    static MyConfigurationElement() 
    { 
     _properties.Add(_portProperty); 
    } 

    protected override ConfigurationPropertyCollection Properties 
    { 
     get { return _properties; } 
    } 

    public int Port 
    { 
     get 
     { 
      return (int)this[_portProperty]; 
     } 
     set 
     { 
      this[_portProperty] = value; 
     } 
    }  
} 
+0

+1 : 나는 항상 그렇게하는 것을 무시합니다 ;-) 이것은 또한 (런타임 동안) 다음에 선언적 방법으로 더 빠른 것으로 (즉, 왜 WCF/System.ServiceModel 구성을 위해 사용했는지에 대한 이점이 있습니다 _extensive_입니다. - 죄송합니다. 내가 읽은 곳을 기억하지 못합니다.) 아마도 실제로는 ConfigurationProperty를 컬렉션에 추가/제거하지만 코드에서 get/set 속성 만 제공하는 "잊어 버림"문제가 있습니다. 글쎄요, 어느 쪽의 방법으로도, 결국 당신이하고있는 일을 알고 올바른 "장인 정신"을 가져야 만합니다. –

2

왜 상수를 사용하여 세 가지 문제를 모두 해결하지 못합니까?

예 :

class MyConfigurationElement : ConfigurationElement 
{ 

    // Use public, private or internal, as you see fit. 
    private const string PortName = "port"; 

    // Add something like this, if you also want to access the string value 
    // and don't want to recompile dependend assemblies when changing the 
    // string 'port' to something else. 
    // public static readonly PortNameProperty = PortName; 

    [ConfigurationProperty(PortName, DefaultValue = (int)0, IsRequired = false)] 
    [IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)] 
    public int Port 
    { 
     get 
     { 
      return (int)this[PortName]; 
     } 
     set 
     { 
      this[PortName] = value; 
     } 
    }  
} 

사이드 참고 : 당신은 또한 Configuration Section Designer을 고려할 수 있습니다. 솔직히, 나는 2 년 전만에 그것을 테스트했고, 그 이후로는 사용하지 않았을 것입니다. 그러나 아마도 DRY에 대한 당신의 우려도 해결할 것입니다.

+1

나는 복사/붙여 넣기/편집 오류로 생각합니다. Foo 속성을 만들기 위해 Port 속성을 복사합니다. 속성 선언을 PortName에서 FooName으로 변경하지만 get/set 참조를 변경하는 것을 잊어 버리면 올바르게 컴파일됩니다. 모든 문제를 해결하는 솔루션을 사용하면 세 번 반복하지 않고 한 번만 이름을 지정할 수 있습니다. 그러나 상수를 사용하는 것은 반복 된 마법 문자열보다 여전히 개선 된 기능입니다. – hatchet

+1

@hatchet이 동의했습니다. 그러나 나는 우리가 여기서 복잡한 일을해서는 안된다고 생각합니다. 약간의 보살핌과 좋은 테스트는 그러한 문제를 쉽게 잡습니다. 또한 XSD 파일 문제가 여전히 남아 있습니다. 어쨌든 app.config 파일을 편집 할 때 적절한 인텔리 센스 지원을 위해 작성해야합니다. 거기에 다시 (속성) 이름이 있습니다. 단일 소스에서 제공되는 코드/XSD 생성이 짧다면 여기서 도움이되는 것은 없습니다. –

관련 문제