Прошу вибачення за довге запитання, воно читається трохи як шахрайство, але обіцяю, що це не так! Я підсумував мої питання нижче
У світі MVC все зрозуміло. Модель має стан, у Перегляді показана модель, а Контролер виконує роботу з / з Моделлю (в основному), контролер не має стану. Щоб виконати завдання, контролер має певні залежності від веб-служб, сховища, партії. Коли ви призначаєте контролер, ви піклуєтесь про забезпечення цих залежностей, нічого іншого. Виконуючи дію (метод на Controller), ви використовуєте ці залежності для отримання або оновлення Моделі або виклику іншої служби домену. Якщо є якийсь контекст, скажімо, що, якби хтось бажає бачити деталі певного елемента, ви передаєте ідентифікатор цього елемента як параметр дії. Ніде в Контролері немає посилань на будь-який стан. Все йде нормально.
Введіть MVVM. Я люблю WPF, я люблю прив'язку даних. Я люблю рамки, які роблять прив'язку даних до ViewModels ще простішою (використовуючи Micro Atm Caliburn Micro). Я вважаю, що все є менш простим у цьому світі. Давайте робити вправу ще раз: Модель має стан, вид показує модель уявлення, і ViewModel робить матеріал к / с моделлю ( в основному), модель подання дійсно є стан! (Уточнити, може бути , він делегує всі властивості в одній або декількох моделей, але це означає , що він повинен мати посилання на одну сторону моделі або інший, що держава сама по собі) Для того, щоб зробитиречі ViewModel мають деякі залежності від веб-служб, сховища, багато. Коли ви створюєте інсталяцію ViewModel, ви дбаєте про те, щоб забезпечити ці залежності, а також стан. І це, пані та панове, мене дратує без кінця.
Кожного разу, коли вам потрібно створити копію ProductDetailsViewModel
з ProductSearchViewModel
(з якого ви подзвонили, ProductSearchWebService
який у свою чергу повернувся IEnumerable<ProductDTO>
, все ще зі мною?), Ви можете зробити одну з таких дій:
- Виклик
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, це погано, уявіть собі ще 3 залежності, це означаєProductSearchViewModel
потрібно взяти і на ці залежності. Також міняти конструктор болісно. - дзвінок
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, фабрика - це лише функція, їх легко генерує більшість фреймворків IoC. Я думаю, що це погано, оскільки методи Ініта - це непрохідна абстракція. Ви також не можете використовувати ключове слово для читання лише для полів, встановлених у методі Init. Я впевнений, що є ще кілька причин. - зателефонуйте
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
Отже ... це шаблон (абстрактний завод), який зазвичай рекомендується для подібного типу проблем. Я хоч і був геніальним, оскільки задовольняв мою тягу до статичного набору тексту, поки я фактично не почав його використовувати. Я вважаю, що кількість кодової коробки занадто велика (ви знаєте, окрім смішних назв змінних, якими я користуюся). Для кожного ViewModel, який потребує параметрів часу виконання, ви отримаєте два додаткових файли (заводський інтерфейс та реалізація), і вам потрібно ввести залежності від часу виконання, наприклад, 4 додаткові рази. І кожного разу, коли залежність змінюється, ви можете змінювати її і на заводі. Таке враження, що я навіть більше не використовую контейнер DI. (Я думаю, що у Замку Віндзора є якесь рішення для цього [з його власними недоліками, виправте мене, якщо я помиляюся]). - робити щось з анонімними типами чи словником. Мені подобається моє статичне введення тексту.
Так, так. Змішування стану та поведінки таким чином створює проблему, яка взагалі не існує в MVC. І я відчуваю, що наразі не існує адекватного рішення цієї проблеми. Тепер я хотів би поспостерігати за деякими речами:
- Люди фактично використовують MVVM. Тому вони або не переймаються всіма перерахованими, або мають інше геніальне рішення.
- Я не знайшов поглибленого прикладу MVVM з WPF. Наприклад, проект зразка NDDD надзвичайно допоміг мені зрозуміти деякі концепції DDD. Мені б дуже хотілося, якби хтось міг би вказати мені на бік чогось подібного для MVVM / WPF.
- Можливо, я роблю MVVM все неправильно, і я повинен перевернути свою конструкцію догори ногами. Можливо, я взагалі не повинен мати цієї проблеми. Ну я знаю, що інші люди задали те саме питання, тому я думаю, що я не єдиний.
Узагальнити
- Чи правильно я роблю висновок, що те, що ViewModel є точкою інтеграції як стану, так і поведінки, є причиною певних труднощів із схемою MVVM в цілому?
- Чи використовує абстрактний заводський візерунок єдиний / найкращий спосіб створити ViewModel статично набраним способом?
- Чи є щось на зразок глибокої довідкової реалізації?
- Має багато ViewModels із станом та поведінкою дизайнерським запахом?