Пользовательские атрибуты на интерфейсах или классы, которые их реализуют? - PullRequest
1 голос
/ 13 января 2009

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

Обновление: В основном я пишу собственный механизм хранения данных для проекта, а объекты представляют различные хранимые таблицы. Пользовательский атрибут используется для обозначения того, какая таблица в наборе данных используется для хранения объектов этого класса, а также для определения того, какие таблицы участвуют в отношении n: m.

Так что, если я помещу атрибуты в интерфейс, это более понятный подход или он загромождает интерфейс и делает доступ к самим данным более громоздким?

Ответы [ 2 ]

3 голосов
/ 13 января 2009

Это зависит от сценария. WCF, например, украшает интерфейсы для контрактов операций.

Однако, если вы собираетесь говорить о объектах (а не о самом интерфейсе), обратите внимание, что вызов кода может быть болезненным для получения метаданных интерфейса, особенно если класс использует явные реализация интерфейса.

Было бы более обычно украшать класс, но это не совсем тот же вопрос; -p

Если атрибут действительно относится к интерфейсу (не к экземплярам), тогда хорошо - украсить интерфейс и поговорить о typeof(IFoo) и т. Д. Но если вы ожидаете, что код сможет установить введите значения для атрибутов, они должны быть на уровне класса.

Какой сценарий?

2 голосов
/ 13 января 2009

Ну, это зависит от того, имеет ли интерфейс какое-либо отношение к метаданным.

interface IRunnable
{
    void Run();
}

class Test : IRunnable
{
    public void Run() { }
}

В этом примере имеет смысл поместить атрибуты в интерфейс, если они относятся к цели интерфейса. Если атрибуты применимы ко всем реализациям, поместите атрибуты в интерфейс.

Однако, если атрибуты не имеют ничего общего с «работоспособностью» (с «работоспособностью», относящейся к IRunnable, а не CLR) класса, тогда поместите атрибуты в класс.

...