2009-05-22 105 views
4

我有一個DataContract類,我必須填寫來自我們公司的Active Directory的值。適當使用自定義屬性?

[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不是真正的性能問題。

回答

1

我喜歡使用屬性來解決這種問題,因爲它有助於在代碼中明確指出該屬性正在以某種方式使用。將PropertiesToLoad放置在一個地方(如上面的示例中)或屬性聲明的位置之間有一個折衷。我傾向於發現使用屬性有助於代碼維護,因爲如果屬性被刪除或修改,我不必追查更改。

至於性能,是的,它會導致性能下降,但不是很大。它是可測量的,但除非這是性能關鍵代碼,否則您可能不會注意到。即使在那個時候,我猜你會發現更大的問題。如果屬性反射成爲問題,則可以通過使用緩存或其他方法來減輕性能影響。

3

使用反射和屬性慢於普通C#編譯爲IL,但問題是:你在做多少?如果你不是這樣做的地段,你不會注意到它。

有些方法可以提高反射的性能,但它們相當先進。

這似乎是一種指定映射的合理方式(並且與大多數序列化和持久性框架相當 - 儘管通常也提供了不帶屬性的單獨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快速填充對象 - 但是,tbh,AD查詢通常比內存中的某些操作要慢,所以我期待着結果。 :)