Пользовательские атрибуты в интерфейсах или классах, которые их реализуют?

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

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

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


person Jason Miesionczek    schedule 13.01.2009    source источник


Ответы (2)


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

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

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

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

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

person Marc Gravell    schedule 13.01.2009

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

interface IRunnable
{
    void Run();
}

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

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

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

person Andrew Hare    schedule 13.01.2009