Discussion on answer by andreycha як почати користуватися mvp winforms

@ Пандакун прокотить, але особисто я б явно передавав цей параметр при виклику методу презентера. Взагалі у вас там мішанина: події CellChanged в інтерфейсі уявлення і підписки на нього в презентери бути не повинно. Замість цього ви додаєте в презентер метод SavePlavka (), куди передаєте параметром поточну запис (selectPlavka).

@andreycha "в MVVM модель являє собою самі дані, <.> без будь-якої бізнес-логіки "- цитата з опису." MVVM використовується для поділу моделі і її уявлення <.> розробник задає логіку роботи з даними, а дизайнер відповідно працює з призначеним для користувача інтерфейсом. "- тобто модель містить бізнес-логіку.

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

@andreycha "мабуть я перестарався з терміном" бізнес-логіка "" - так у UI може бути своя логіка, наприклад, як у групи radiobutton'ов - один включається, інший вимикається. А бізнес-логіка - це логіка додатки / системи, вона розчинена в типах / класах і т.д. Напевно, про різні логіки треба якось відобразити у відповіді, щоб не було плутанини.

@andreycha На жаль в чаті Ви не можете відповісти, змушений продовжити писати питання тут. Повертаюся до питання про Order []. Оскільки я використовую Entity Framework і підхід Code First. то в моєму випадку є ряд класів, які описують структуру таблиці. Ці класи я і використовую в якості призначених для користувача типів, які гуляють між View<->Presente-> Model. Але до чого мені віднести ці класи? Це теж частина моделі або може це більше відноситься до DAL?

@andreycha Повертаюся до подієвої моделі. Адже кому, як не моделе знати про те, що вона змінилася. Що в неї вставлені дані або видалені. Так чи не логічно, щоб модель повідомляла про те, що в ній відбулися зміни, а все кого це цікавить - контролери, наприклад, були б підписані на ці події і викликали б у форм відповідні методи по перемальовуванні (оновленню) даних?

@andreycha Чи має значення яким саме чином презентер повинен отримувати від моделі дані? Наприклад в моделі є метод Select. Щоб отримати дані з моделі презентер може викликати метод Select. А як цей метод повинен передати дані в презентер? Через retrun або через виклик методу смого презентера - це взагалі має значення?

@MikhailDanshin дані повертати через return. Модель в ідеалі нічого не знає про презентери.

@MikhailDanshin про поновлення - можна і так. Хоча в своїй практиці мені не доводилося реалізовувати події в моделі.

@MikhailDanshin про Order - по ідеї це об'єкт DAL'а. Але для презентера він - частина моделі, тому як зазвичай презентер нічого не знає про зовнішній світ. Але це не принципове питання. У вас також можуть бути об'єкти, які використовуються тільки для відображення і передаються поданням. Наприклад, Order важкий об'єкт, з якого треба відобразити пару полів. Можна мапіть його в деякий OrderLight, який і віддавати поданням. Але це все варіанти.

@andreycha З приводу повертати через return. Чи не подивіться ось це обговорення ru.stackoverflow.com/q/477689/194602. Я там описав проблему повернення значення і поки не отримав відповідь.

@andreycha А можете ще раз пояснити, навіщо в презентери ось цей рядок private readonly IOrdersModel model ;. Не можна жорстко зв'язати презентер і модель, якщо вони все одно повинні працювати разом і тим самим розв'язати модель і уявлення?

@MikhailDanshin для тестування: щоб в тестах можна було підставити свою заглушку.

@andreycha Чи не могли б Ви розкрити зміст фрази "Передавати в уявлення вже створений презентер". А взагалі повертаючись до розмови про "розв'язати уявлення і модель" виходить замкнуте коло. Однією з цілей реалізації паттерна MVP є полегшення автоматичного модульного тестування. Але виходить якщо я реалізую MVP (Passive View) за всіма правилами, то я ніяк не досягну мети полегшення тестування.

@MikhailDanshin 1) Якось так: var presenter = new MyPresenter (new MyModel ()); var form = new MyForm (presenter); 2) Чому не досягнете полегшення тестування? Мета - протестувати логіку екрану, не прив'язуючись до інтерфейсу. Логіка виноситься в презентер - презентер тестується. Зрозуміло, що від чисто UI'них багів вас це не позбавить.