У меня есть следующие слои в моем решении:
- App.Domain
- App.Service
- App.Core (возможно, вы называете это App.DataLayer)
- App.Web
Шаблон проектирования программного обеспечения не мой вопрос, у меня есть следующая модель в Domain
public class Foo {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Я хочу использовать эту модель в представлении (например, на домашней странице) И я хочу использовать Id, Name & Value
, поэтому, если я хочу создать ViewModel, я добавлю следующее:
public class FooViewModel {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Так это хорошая идея? или просто использовать Foo
вместо FooViewModel
?
asp.net-mvc
model
Мехди Дехгани
источник
источник
Model
обычно не передаетсяView
? Почему именно вам нужно воссоздать поляModel
вView
? Если целью является разделение интересовMVC
, при каких обстоятельствах можно сделать то же самое сModel
иView
? ЕслиViewModel
есть и то и другое, то почему бы не расширять / составлять обаModel
иView
?Ответы:
На первый взгляд это может выглядеть как нарушение правила DRY, но я бы сказал, что «похожий и даже идентичный код» не обязательно «повторяется», если он делает что-то другое или может измениться независимо. А в случае моделей представлений код определяет то, что видит «клиент», а не обязательно объекты и операции, о которых говорит бизнес. Таким образом, вы часто показываете клиенту или интерфейсу модели, которые являются «случайно идентичными». Вы можете изменять бизнес-правила и условия или терминологию конечного пользователя независимо друг от друга.
Итак, я бы перевернул вопрос обратно на вас. Если домен изменяется, допустимо ли для клиентов «версии 1» продолжать использовать старые интерфейсы? Будете ли вы когда-нибудь раскрывать термины или операции в интерфейсе, которые не являются частью "основных бизнес-правил"? И наоборот?
Подобные вопросы в виду, если «функция» вашего взгляда состоит в том, чтобы строго раскрыть модель предметной области, да, похоже, что это нарушает правило СУХОЙ.
Также имейте в виду, что представление некоторых более естественных изменений с изменениями модели также может быть достигнуто в некоторых языках с атрибутами и отражением элемента. (Или с меньшим количеством повторений через другие умные умения ... Но «умный ум» часто не оправдывает повторение, которое вас щадит.)
источник
Foo
, поэтому, если я использовал егоFoo
как ViewModel Кроме того, клиент также получит новое свойство, так что если я должен сделать это новое поле безопасности (может быть true / false для разрешения или что-то в этом роде), что мне делать?User edit form
связана с безопасностью, например, в том , что нам не нужно передаватьIsAdmin
поле клиенту, чтобы сохранить это поле в безопасности, поэтому я беспокоюсь об этом. Извините за мой плохой английский.Я хотел бы иметь модель представления, которая содержала бы только одно свойство, экземпляр Foo. Таким образом, вы не нарушаете DRY согласно какому-либо определению, если Foo изменяется, ваша модель представления автоматически видит изменение, и вы освобождаете себя от прямой связи модели представления с моделью.
Если завтра необходимо, чтобы представление показывало что-то еще, а также Foo, вы можете просто добавить новое свойство, и намерение модели представления все равно будет ясным, оно содержит Foo и что-то еще, у вас не будет смесь свойств от Foo с несвязанными другими свойствами.
Я бы не думал о вашей модели представления как о FooViewModel, я бы думал об этом с точки зрения того, что представление должно отображать. Если он просто отображает один Foo, то модель представления содержит одно свойство, Foo.
Не уверен, что я объяснил это ясно. Если нет, дайте мне знать, и я постараюсь перефразировать его, когда я не сплю!
источник
Я бы сказал, что использование
FooViewModel
таким образом нарушает принцип DRY. Когда вам нужно внести изменения,Foo
вы также должны внести изменения вFooViewModel
. Я думаю, что вы бы лучше служили, просто используяFoo
в качестве модели для вашего взгляда. Я хотел бы рассмотреть модель представления, если вам нужно отобразить вещи из Foo и что-то другое. Например, скажем, вам нужно визуализировать некоторую информацию из,Foo
а также изBar
.источник
Foo
так, потому что яFoo
тоже использовал в качестве ViewModel, поэтому я должен передать это новое поле в представление, я думаю, что это не очень хорошая сделка, что вы думаете ?Foo
иFooViewModel
. Как правило, не рекомендуется изменять несколько файлов для одного логического изменения.true/false
значение для разрешения или что-то в этом роде.