Этот вопрос был вдохновлен моей борьбой с ASP.NET MVC, но я думаю, что это относится и к другим ситуациям.
Допустим, у меня есть модель, сгенерированная ORM, и две модели ViewModel (одна для представления "детали" и одна для представления "редактирования"):
Модель
public class FooModel // ORM generated
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public int Age { get; set; }
public int CategoryId { get; set; }
}
Показать ViewModel
public class FooDisplayViewModel // use for "details" view
{
[DisplayName("ID Number")]
public int Id { get; set; }
[DisplayName("First Name")]
public string FirstName { get; set; }
[DisplayName("Last Name")]
public string LastName { get; set; }
[DisplayName("Email Address")]
[DataType("EmailAddress")]
public string EmailAddress { get; set; }
public int Age { get; set; }
[DisplayName("Category")]
public string CategoryName { get; set; }
}
Редактировать ViewModel
public class FooEditViewModel // use for "edit" view
{
[DisplayName("First Name")] // not DRY
public string FirstName { get; set; }
[DisplayName("Last Name")] // not DRY
public string LastName { get; set; }
[DisplayName("Email Address")] // not DRY
[DataType("EmailAddress")] // not DRY
public string EmailAddress { get; set; }
public int Age { get; set; }
[DisplayName("Category")] // not DRY
public SelectList Categories { get; set; }
}
Обратите внимание, что атрибуты на ViewModels не СУХИЕ - много информации повторяется. Теперь представьте, что этот сценарий умножен на 10 или 100, и вы можете видеть, что он может быстро стать довольно утомительным и подверженным ошибкам для обеспечения согласованности между ViewModels (и, следовательно, между представлениями).
Как я могу "высушить" этот код?
Прежде чем вы ответите: «Просто поместите все атрибуты на FooModel
», я пробовал это, но это не сработало, потому что мне нужно, чтобы мои ViewModels были «плоскими». Другими словами, я не могу просто составить каждую ViewModel с моделью - мне нужно, чтобы моя ViewModel имела только те свойства (и атрибуты), которые должны быть использованы представлением, и представление не может перейти в подсвойства, чтобы получить на значения.
Обновление
Ответ LukLed предлагает использовать наследование. Это определенно уменьшает количество неСУХОГО кода, но не устраняет его. Обратите внимание, что в моем примере выше атрибут DisplayName
для свойства Category
должен быть записан дважды, потому что тип данных свойства различен для отображения и редактирования ViewModels. В небольшом масштабе это не будет большой проблемой, но по мере увеличения масштаба и сложности проекта (представьте, что будет гораздо больше свойств, больше атрибутов для свойства, больше просмотров для модели), все еще существует потенциальная «повторяя себя» изрядная сумма. Возможно, я слишком далеко захожу в DRY, но я все равно предпочел бы, чтобы все мои «понятные имена», типы данных, правила проверки и т. Д. Были напечатаны только один раз.