2009-05-22 19 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"を取り除くこともできます。アトリビュートはこの問題を解決する良い方法だと思いますか?また別の質問として、属性でこれを解決すると、パフォーマンスボトルネックを巨大にする可能性がありますか、属性の使用はパフォーマンス上の問題ではありません。

答えて

1

私は、属性が特定の方法で使用されていることをコード内で明確にするのに役立つので、この種の懸念に属性を使用するのが好きです。 PropertiesToLoadを1つの場所(上記の例のように)に置くか、またはプロパティ宣言のポイントに置くかのトレードオフがあります。属性を使用するとコードのメンテナンスに役立ちます。これは、プロパティが削除または変更された場合に変更を検出する必要がないためです。

パフォーマンスに関しては、はい、パフォーマンスが低下しますが、巨大ではありません。これは測定可能ですが、これがパフォーマンス重視のコードでない限り、おそらく気付かないでしょう。そしてその時点でも、私はあなたがより大きな問題を見つけるだろうと推測しています。属性の反映が問題になる場合は、キャッシュやその他の方法を使用してパフォーマンスの影響を緩和する方法があります。

3

反射と属性の使用は、ILとしてコンパイルされた通常のC#よりも遅いですが、質問は次のとおりです。どのくらいそれをやっていますか? ロットを実行していない場合、気づかないでしょう。

反射のパフォーマンスを向上させる方法はありますが、かなり進歩しています。

マッピングを指定するのは合理的な方法です(ほとんどのシリアル化フレームワークや永続化フレームワークに匹敵しますが、属性のない別の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; } 
} 

私はその後、私はそれの後に配列を埋めるために一度だけリフレクションを使用するので、私はもうGetPropertiesのを呼び出す必要はありません、それ自体はほとんど無害である古い「PropertiesToLoad」を取得するためにリフレクションを使用することができます。

テストに残っている唯一のことは、私がSearchResultからオブジェクトを十分に速く埋めることができるということですが、ADクエリはメモリ内の操作よりも通常遅くなります。結果。 :)