Эффективное использование аннотаций данных ASP.NET MVC с отдельными сборками - PullRequest
4 голосов
/ 14 июня 2011

Допустим, у меня есть сборка домена, которая описывает модель домена, и у нее есть класс с именем product:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

У меня также есть другая сборка, которая является веб-приложением, работающим с этой моделью домена.Теперь я хочу создать форму для создания новых продуктов и проверки некоторых атрибутов.Самый простой способ сделать это - использовать DataAnnotations в классе.Однако это приводит к тому, что модель предметной области теперь содержит метаданные о проверке формы, что не очень четкое разделение проблем.

Возможно иметь атрибут MetadataType для класса, но я вижу это как нетлучше.Внезапно ваш класс модели предметной области становится зависимым от класса метаданных проверки формы.

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

ОБНОВЛЕНИЕ: некоторые люди предложили мне использовать AutoMapperдля этого, о котором я уже знаю.AutoMapper просто делает отображение проще и проще, на самом деле не решает проблему необходимости поддерживать два отдельных класса, которые будут почти идентичны.Я предпочел бы создавать классы форм только тогда, когда в этом есть явная необходимость.

Есть ли прямое объявление аннотаций в веб-сборке без создания ненужных зависимостей для сборки домена?

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Если вы не хотите вводить связь между вашей моделью домена и вашими представлениями, вы должны пойти по пути класса CreateProductForm.

В зависимости от размера / требований вашего проекта, вам рано или поздно придется отделить модель представления от вашего домена. Предположим, вы используете атрибут DisplayName: вы собираетесь пометить свои доменные объекты?

Использование такого инструмента, как AutoMapper, значительно упрощает процесс отображения.

2 голосов
/ 14 июня 2011

Почему бы вам не иметь аннотации данных на классах вашего домена. Если есть что-то, что является Обязательным, то я думаю, что совершенно правильно пометить это как обязательное в домене.

Другие аннотации данных, такие как StringLength, Range и т. Д., Все для меня вполне допустимые вещи для украшения ваших доменных сущностей.

Реализация IValidableObject также является вполне приемлемой вещью для объекта домена для выполнения IMHO.

Я бы не стал помещать на них такие вещи, как UIHint или аннотации, описывающие форматирование свойства. Это было бы плохо.

Обычно я избегаю отображения классов доменов в пользовательском интерфейсе и использую классы ViewModel с инструментом отображения, таким как AutoMapper и т. Д., Для сопоставления одного с другим. Класс ViewModel содержит аннотации класса домена с, возможно, дополнительными аннотациями, специфичными для пользовательского интерфейса.

0 голосов
/ 14 июня 2011

В качестве состояния mathieu и XHalent вы должны использовать CreateProductForm (или CreateProductFormViewModel) вместе с Automapper и создавать атрибуты, которые автоматизируют модель для модели представления для действия.

Таким образом, вся проверка форм проходит в вашей модели представления, а вся проверка данных (связанных с базой данных) - в вашей доменной модели.

В Silverlight и WPF это называется шаблон MVVM , и многие люди, которые делают asp.net mvc, рекомендуют его.

В моем текущем проекте я также использую его с Automapper. У всех моих представлений есть связанная модель представлений, которая является упрощенной версией модели предметной области, специфичной для этого представления.

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

Выполнение этого должно дать вам разделение, которое вы ищете.

...