Це гарна ідея додати ViewModel точно так само, як і Model


16

У моєму розчині є такі шари:

  1. Додаток.Домен
  2. App.Service
  3. App.Core (можливо, ви називаєте це одним App.DataLayer)
  4. 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?


Я не впевнений, що розумію це. Чи не Modelпередається звичайно View? Чому саме вам потрібно відтворити поля Modelв області View? Якщо поділ завдань є метою MVC, за яких обставин один хоче зробити те ж саме з Modelі View? Якщо ViewModelі те, і інше, чому б не розширити / скласти обидва Modelі View?
null

будь ласка, прочитайте мої коментарі до відповіді @ svidgen
Мехді Деггані

У мене пов'язана проблема - де валідація (обов'язковий атрибут) на моделях (і в базі даних) повинна бути введена певна величина - але в представленнях ці значення не потрібно - тому я змушений копіювати деякі поля з моделі вкладаються в модель перегляду, а не посилаються на модель безпосередньо. Однак, замислившись, це, ймовірно, добре і справді не порушує сухих, оскільки вони призначені для різних цілей (не так вже й погано).
niico

Відповіді:


20

Спочатку це може виглядати як порушення правила DRY, але я заперечую, що "подібний і навіть однаковий код" не обов'язково є "повторенням", якщо він робить щось інше або може змінити самостійно. Що стосується моделей перегляду, код визначає те, що бачить "клієнт", не обов'язково суб'єкти та операції, про які ведеться бізнес. Отже, ви часто виявляєте клієнту чи інтерфейсу моделі, які є "випадково однаковими". Ви можете змінювати або бізнес-правила, або терміни кінцевого користувача незалежно один від одного.

Отже, я поверну вам питання. Якщо домен змінюється, чи прийнятно для клієнтів "версії 1" продовжувати використовувати старі інтерфейси? Ви коли-небудь розкриєте терміни чи операції в інтерфейсі, які не є частиною "основних правил бізнесу"? І навпаки?

Такі питання на увазі, якщо "функція" вашого зору полягає в чіткому розкритті основної моделі домену, так, це здається, що це порушує правило DRY.

Також майте на увазі, висловлюючи думку про те, що більш природні зміни зі змінами моделі також можуть бути здійснені на деяких мовах з атрибутами членів та відображенням. (Або з меншою повторенням через інші подвиги кмітливості ... Але "розумність" часто не може виправдати повторення, яке вона вас щадить.)


Хороші згадані нотатки (проголосуйте за це), як я вже говорив як коментар до попередньої відповіді, я говорю про загальну мету, зображення, можливо, через кілька днів, я вирішив додати нове поле / властивість Foo, так що якщо я використовував Fooяк ViewModel теж клієнт отримає нове майно, тож як бути, якщо це нове було полем безпеки (можливо, правда / неправда для дозволу чи щось подібне), що мені робити?
Мехді Дехгані

@mehdi Вам потрібно буде більш конкретно визначити, яке поле ви думаєте додати, і чому ви вважаєте, що це робить чи не належить до перегляду. Або взагалі, в чому турбота.
svidgen

@mehdi, щоб бути зрозумілим, якщо ви турбуєтесь про те, щоб кінцеві користувачі змінили значення безпеки, ваш домен просто не повинен дозволяти користувачам зберігати речі, на які вони не мають права зберігати
svidgen

Чому ми використовуємо ViewModels? Існують деякі причини, як ми знаємо, одна з них - для безпеки, наприклад, в тому User edit form, що нам не потрібно передавати IsAdminполе клієнту, щоб зберегти це поле в безпеці, тому це мене хвилює. вибачте за мою погану англійську.
Мехді Дехгані

1
По-іншому, я вважаю, що оригінальне запитання - це повне питання. Питання, яке ви намагаєтеся з'ясувати в коментарях тут, - це ще одне повне запитання. І коментарі - це не гарний спосіб отримати хороші, якісні відповіді.
svidgen

2

Я мав би модель перегляду, яка містила лише одне властивість, екземпляр Foo. Таким чином, ви не порушуєте DRY згідно з будь-яким його визначенням, якщо Foo змінюється, ваша модель перегляду автоматично бачить зміни, і ви залишаєте себе вільним від прямої прив’язки моделі перегляду до моделі.

Якщо завтра вигляд повинен показати щось інше, а також Foo, ви можете просто додати нову властивість, і намір вашої моделі перегляду все одно буде зрозумілий, він містить Foo та щось інше, у вас не буде суміш властивостей від Foo з неспорідненими іншими властивостями.

Я б не вважав вашу модель перегляду як FooViewModel, я б думав про це з точки зору того, що подання має відображатися. Якщо він відображає лише один Foo, то модель перегляду містить одну властивість, Foo.

Не впевнений, чи я це чітко пояснив. Якщо ні, то дайте мені знати, і я спробую переробити це, коли прокинусь!


-2

Я б сказав, що використання FooViewModelтаким чином порушує принципи DRY. Коли вам потрібно внести зміни, Fooвам також доведеться внести зміни FooViewModel. Я думаю, що вам краще послужити просто, використовуючи Fooяк модель для вашого погляду. Я б розглядав модель перегляду, якщо вам потрібно відобразити речі з Foo та щось інше. Наприклад, скажіть, що вам потрібно надати деяку інформацію з, Fooа також з Bar.


Скажіть, будь ласка, якщо я вирішив додати ще одне поле / властивість до Foo, тому що я також використовував Fooяк ViewModel, тому я повинен також передати це поле для перегляду, я думаю, це не дуже добре, що ви думаєте ?
Мехді Дехгані

Я не бачу нічого поганого в тому, щоб View використовував лише підмножину даних, викритих моделлю. Я думаю, що більший помилок - це зв'язок між Fooі FooViewModel. Як правило, не годиться змінювати кілька файлів для однієї логічної зміни.
zero_dev

Що щодо того, якщо це додане поле було полем безпеки, таким як якесь true/falseзначення для дозволу чи щось подібне.
Мехді Дехгані

Вам не потрібно виставляти такі поля в самому Перегляді, але все ж слід переконатися, що решта вашого коду не дозволяє користувачеві змінювати рівень безпеки, на випадок, якщо зловмисний користувач намагається розмістити таку зміну.
Грем

Схоже, це було б відкрито для масових атак на призначення
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.