Надлежащее использование пользовательских атрибутов? - PullRequest
4 голосов
/ 22 мая 2009

У меня есть класс 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" };
}

Я собирался создать собственный атрибут для украшения моих свойств, чтобы код, который будет заполнять мой объект из AD, не нуждался в жестком кодировании Mapping, а скорее я мог просто декорировать свойства для автоматического заполнения объект.

И в долгосрочной перспективе я мог бы также избавиться от этого "PropertiesToLoad". Считаете ли вы, что атрибуты являются хорошим способом решения этой проблемы? И еще один вопрос: если я все же решу это с помощью атрибутов, могу ли я получить огромную производительность или использование атрибутов не является проблемой производительности.

Ответы [ 3 ]

3 голосов
/ 22 мая 2009

Использование отражения и атрибутов медленнее , чем обычный C #, скомпилированный как IL, но вопрос в следующем: сколько вы это делаете? Если вы не делаете лотов этого, вы этого не заметите.

Есть способы повысить производительность отражения, но они достаточно продвинуты.

Это кажется разумным способом определения сопоставления (и сравнимо с большинством сред сериализации и постоянства - хотя часто предлагается и отдельный API без атрибутов).

Для (не) соответствующего использования см. блог Эрика Липперта .

1 голос
/ 22 мая 2009

В итоге я написал следующий код.

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 обычно намного медленнее, чем некоторые операции в памяти, поэтому я с нетерпением жду результата , :)

1 голос
/ 22 мая 2009

Мне нравится использовать атрибуты для такого рода проблем, потому что это помогает прояснить в коде, что свойство используется определенным образом. Существует компромисс между наличием PropertiesToLoad в одном месте (как в примере выше) или в точке объявления свойства. Я склонен находить, что использование атрибутов помогает сопровождению кода, потому что мне не нужно выслеживать изменения, если свойство удалено или изменено.

Что касается производительности, то да, это приведет к снижению производительности, но не очень. Это измеримо, но если это не критичный для производительности код, вы, вероятно, не заметите. И даже в этот момент, я думаю, вы найдете более серьезные проблемы. Если отражение атрибута становится проблемой, существует способ уменьшить влияние на производительность с помощью кэширования или других методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...