2009-05-22 3 views
4

우리 회사의 Active Directory에서 값으로 채워야하는 DataContract 클래스가 있습니다. 나는 AD에서 내 개체를 채우는 것 코드 매핑 하드 코딩이 필요하지 않을 수 있도록, 내 성질을 장식하는 사용자 지정 특성을 만들기 위해 고려하고맞춤 속성의 적절한 사용?

[DataContract(Namespace = Global.Namespace)] 
public class UserProfile 
{ 
    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    public string EmployeeID { get; private set; } 

    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    public string GivenName { get; private set; } 

    ... 

    public static readonly string[] PropertiesToLoad = new[] { "EmployeeID", "GivenName" }; 
} 

아니라 그냥 속성을 장식 할 수 많은 자동으로 객체를 채 웁니다.

그리고 장기적으로이 "PropertiesToLoad"를 제거 할 수도 있습니다. 당신은 Attributes가이 이슈를 푸는 좋은 방법이라고 생각합니까? 그리고 또 다른 질문으로, 만약 내가 Attributes로 이것을 해결한다면, 나는 거대한 퍼포먼스 병 목을 만들거나 Attributes의 사용은 성능상의 문제가 아닙니다.

답변

1

나는 속성이 특정 방식으로 사용된다는 것을 코드에서 명확히하는 데 도움이되기 때문에 이런 종류의 관심사에 대한 속성을 사용하고자합니다. PropertiesToLoad를 한 곳 (위의 예제 에서처럼)이나 속성 선언 지점 사이에 교환하는 것이 좋습니다. 속성을 사용하거나 제거하면 변경 사항을 추적 할 필요가 없으므로 특성을 사용하면 코드 유지 관리에 도움이되는 경향이 있습니다.

성능면에서 성능 저하는 있지만 거대한 것은 아닙니다. 그것은 측정 할 수 있지만 성능에 중요한 코드가 아니라면주의를 기울이지 않을 것입니다. 그리고 심지어 그 시점에서, 나는 당신이 더 큰 문제를 찾을 것이라고 생각하고 있습니다. 특성 반영이 문제가되면 캐싱 또는 다른 방법을 사용하여 성능 영향을 완화 할 수있는 방법이 있습니다.

3

반향 및 속성을 사용하면 은 IL로 컴파일 된 일반 C#보다 느린이지만 질문은 다음과 같습니다. lot을 수행하지 않으면 알 수 없습니다.

리플렉션 성능을 향상시키는 방법이 있지만 상당히 개선되었습니다.

이는 매핑을 지정하는 합리적인 방법으로 보이며 (대부분의 직렬화 및 지속성 프레임 워크와 비슷하지만 종종 속성이없는 별도의 API도 제공되지만).

적절한 용도로는 Eric Lippert's blog을 참조하십시오.

1

다음 코드가 작성되었습니다.

public class UserProfile 
{ 
    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty] 
    public string EmployeeID { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty] 
    public string GivenName { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty("SN")] 
    public string Surname { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty] 
    public string Company { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty] 
    public string Department { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty("CN")] 
    public string UserName { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty("Mail")] 
    public string Email { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    [ActiveDirectoryProperty] 
    public LanguageType Language { get; set; } 


    [DataMember(IsRequired = true, EmitDefaultValue = false)] 
    public DateTime? NextPasswordChangeDate { get; set; } 
} 

그때 나는 그 후 배열을 채우기 위해 한 번만 반사를 사용하기 때문에, 대부분 무해 자체에 이전 "PropertiesToLoad"을 얻기 위해 반사를 사용할 수 있습니다, 더 이상 GetProperties를 호출 할 필요가 없습니다.

테스트할만한 것이 있다면, SearchResult에서 객체를 충분히 빨리 채울 수 있다면, AD 쿼리는 보통 메모리 내 작업보다 속도가 더 빠르기 때문입니다. 결과. :)