Я пытаюсь изучить и применить MVP к приложению WinForm с помощью Passive View.Я просмотрел материал в сети (некоторые пошли мне на ум), но не смог найти эту тему, объясненную в простых терминах.Я хочу понять две вещи:
Должен ли докладчик позвонить другому докладчику (ам) только для того, чтобы сохранить единую ответственность?Или обрабатывать всю связанную логику (модели) самой?
Как любой докладчик может зарегистрироваться на события любого представления, пока представление не передается докладчику?
Предположим, две сущности: Человек и Автомобиль.Человек может иметь 1 или более автомобилей.Могут быть простые представления, такие как SinglePersonView
и SingleCarView
, которые имеют соответствующих докладчиков, таких как PersonPresenter
и CarPresenter
.Тем не менее, может быть представление, которое показывает список автомобилей для любого человека.Эта форма (скажем, PersonsCarsView
) будет иметь дело как с личными, так и с автомобильными сущностями через своего предъявителя PersonsCarsPresenter
.Предположим, что пользователь выбирает человека, и в списке указаны автомобили, принадлежащие этому человеку.Если пользователь дважды щелкает на автомобиле (событие, определенное в IPersonsCarsView
как OnCarClick
), он открывает новую форму SingleCarView
.
Теперь я застрял здесь.Немного больше информации:
Представление не передается конструктору докладчика, вместо этого докладчик хранит ссылку на представление как личную переменную.
Докладчик подписывается на события своего представления в конструкторе
Как бы PersonsCarsPresenter
справился с этим, то есть показал бы детали одного автомобиля, в то время как он должен быть единоличной ответственностью CarPresenter
?Должна ли она также содержать ссылку на SingleCarView
?
Что я пробовал:
Добавить другое определение конструктора для CarPresenter
, которое принимает PersonsCarsView
в качестве аргумента.Затем
PersonsCarsPresenter
создайте экземпляр CarPresenter
перед отображением PersonsCarsView
и передайте это представление (PersonsCarsView
) в CarPresenter
, чтобы оно могло подписаться на событие OnCarClick
реализовано PersonsCarsView
.
С помощью этого метода, я думаю, я достиг одной ответственности, т.е. CarPresenter
будет иметь дело с отображением информации об автомобиле, и весь соответствующий код должен быть в CarPresenter
и PersonsCarsPresenter
не должны ничего знать о том, какой вид или как собирается информация для отображения одного автомобиля.Но в то же время он жестко связал CarPresenter
с PersonsCarsPresenter
, что, на мой взгляд, и есть модель, то есть человек привязан к автомобилям.
Чего я не понимаюв том, что CarPresenter
не должен содержать ссылку на PersonsCarsView
форму как переменную, поскольку он должен знать, что это конкретное представление может также вызывать вызов.Но тогда это будет что-то вроде Dim _PersonsCarsViewRef = New PersonsCarsView
, которое будет новой формой , а не , которая открывается при PersonsCarsPresenter
при запуске (та, которая теперь передается конструктору CarPresenter
).Но представление передается презентатору, чего я хочу избежать, чтобы сохранить слабо связанный вид презентатора.