2016-06-13 4 views
2

У меня есть модель, которая должна быть сохранена в коллекции MongoDB. Чтобы получить имя коллекции, у меня есть два варианта передо мной.Атрибут против статического свойства

1) Атрибут

Я украсить класс с помощью пользовательских атрибутов и использовать отражение для доступа к значению внутри него. Затем я могу кэшировать его с помощью type, чтобы избежать будущих поисков.

[MongoCollection("Foo")] 
public class Foo 
{ 
} 

2) Статическое свойство

Здесь у меня есть статическое свойство в классе, который содержит название коллекции.

public class Foo 
{ 
    public static string CollectionName { get { return "Foo"; } } 
} 

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

Есть ли случай, который нужно сделать для первого варианта, или лучше пойти с вариантом 2?

+4

Прежде всего, как вы будете фильтровать классы, если они arent отмечены атрибутами? И имхо. Если старший переводит свой нос на нечеткий атрибут, он должен сильно переусердствовать в своей профессии. Многие механики в .net основаны на отражении (например, MEF, чтобы назвать только один). Почти все полезные расширения, такие как EntityFramework или NUnit, также работают с отражением. Я бы не рекомендовал вариант 2 – lokusking

+0

Я согласен с тем, что первый вариант является более чистым. Вариант три может состоять в том, чтобы использовать одно и то же имя для коллекции и класса. – ChriPf

+1

@ChriPf Я чувствую, что это может сделать рефакторинг немного кошмаром. Если по какой-либо причине имя класса изменяется, сбор нужно будет переименовать. Или я чего-то не хватает? –

ответ

5

Это явный случай метаданных по сравнению с данными:

  • Вариант 1: Атрибуты , как предполагается, держать метаданных об объектах они прикреплены.
  • Вариант 2: поля и свойства членов, независимо от того, являются ли они экземплярами или статическими, должны провести данные, которые составляют интегральное значение класса.

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

+0

Это был мой план. У меня есть класс менеджера, в котором есть кеш. Кажется, есть мнение, что размышление медленное, и его следует избегать. Даже если существующие фреймворки используют его, «они знают, как правильно его использовать» ... –

+0

Я, вероятно, продолжу атрибуты и приготовлюсь к рассмотрению дела в обзоре кода. –

+0

@DavidPilkington Да, на самом деле это «медленно» в тех случаях, когда вам нужно делать миллионы поисков атрибутов. В таком случае простой кеш устраняет проблему. Возможным преимуществом полного кэширования aproach является возможность добавления атрибутов во время выполнения. Это может быть полезно в определенных сценариях. –

Смежные вопросы