Как докладчики могут подписаться на события других представлений, не рассматривая их в качестве аргумента, и нести единоличную ответственность? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь изучить и применить MVP к приложению WinForm с помощью Passive View.Я просмотрел материал в сети (некоторые пошли мне на ум), но не смог найти эту тему, объясненную в простых терминах.Я хочу понять две вещи:

  • Должен ли докладчик позвонить другому докладчику (ам) только для того, чтобы сохранить единую ответственность?Или обрабатывать всю связанную логику (модели) самой?

  • Как любой докладчик может зарегистрироваться на события любого представления, пока представление не передается докладчику?

Предположим, две сущности: Человек и Автомобиль.Человек может иметь 1 или более автомобилей.Могут быть простые представления, такие как SinglePersonView и SingleCarView, которые имеют соответствующих докладчиков, таких как PersonPresenter и CarPresenter.Тем не менее, может быть представление, которое показывает список автомобилей для любого человека.Эта форма (скажем, PersonsCarsView) будет иметь дело как с личными, так и с автомобильными сущностями через своего предъявителя PersonsCarsPresenter.Предположим, что пользователь выбирает человека, и в списке указаны автомобили, принадлежащие этому человеку.Если пользователь дважды щелкает на автомобиле (событие, определенное в IPersonsCarsView как OnCarClick), он открывает новую форму SingleCarView.

Теперь я застрял здесь.Немного больше информации:

  • Представление не передается конструктору докладчика, вместо этого докладчик хранит ссылку на представление как личную переменную.

  • Докладчик подписывается на события своего представления в конструкторе

Как бы PersonsCarsPresenter справился с этим, то есть показал бы детали одного автомобиля, в то время как он должен быть единоличной ответственностью CarPresenter?Должна ли она также содержать ссылку на SingleCarView?

Что я пробовал:

  1. Добавить другое определение конструктора для CarPresenter, которое принимает PersonsCarsView в качестве аргумента.Затем

  2. PersonsCarsPresenter создайте экземпляр CarPresenter перед отображением PersonsCarsView и передайте это представление (PersonsCarsView) в CarPresenter, чтобы оно могло подписаться на событие OnCarClickреализовано PersonsCarsView.

С помощью этого метода, я думаю, я достиг одной ответственности, т.е. CarPresenter будет иметь дело с отображением информации об автомобиле, и весь соответствующий код должен быть в CarPresenter и PersonsCarsPresenter не должны ничего знать о том, какой вид или как собирается информация для отображения одного автомобиля.Но в то же время он жестко связал CarPresenter с PersonsCarsPresenter, что, на мой взгляд, и есть модель, то есть человек привязан к автомобилям.

Чего я не понимаюв том, что CarPresenter не должен содержать ссылку на PersonsCarsView форму как переменную, поскольку он должен знать, что это конкретное представление может также вызывать вызов.Но тогда это будет что-то вроде Dim _PersonsCarsViewRef = New PersonsCarsView, которое будет новой формой , а не , которая открывается при PersonsCarsPresenter при запуске (та, которая теперь передается конструктору CarPresenter).Но представление передается презентатору, чего я хочу избежать, чтобы сохранить слабо связанный вид презентатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...