Я столкнулся с этой проблемой в течение нескольких месяцев в приложении, над которым я работаю. Вывод, к которому я пришел совсем недавно, состоит в том, что во многих случаях может быть невозможно применить шаблон MVP как на уровне окна, так и на уровне управления пользователем, не «нарушая» шаблон.
Моя мысль заключается в том, что пользовательский элемент управления является частью реализации представления, и докладчик не должен знать, что происходит внутри реализации представления, что означает, что докладчик на уровне окна по расширению не должен знать о пользователе предъявитель контроля, и, следовательно, не должно быть никакой связи между ними, в том числе создание экземпляров последнего первым. Можно утверждать, что презентатор пользовательского элемента управления является частью реализации представления окна, и поэтому представление окна может создавать экземпляр презентатора пользовательского элемента управления. Но он не может внедрить классы моделей, в которых нуждается докладчик, потому что представление не должно знать о них.
Вывод, к которому я пришел, заключается в том, что ВСЕ пользовательские элементы управления зависят от реализации представления и поэтому должны полностью содержаться в хранилище представлений большего шаблона. Таким образом, у них нет собственных презентаторов ... По крайней мере, они не связаны с самой реализацией элемента управления. Вместо этого они должны управляться косвенно презентатором родительского окна через сквозные поля, отображаемые в интерфейсе представления. Короче говоря, пользовательский элемент управления предоставляется презентатору не через его собственный интерфейс, а через общий сквозной интерфейс, реализованный его родительским представлением. Назовите это «интерфейсом частичного представления».
Ваш докладчик может содержать экземпляры повторно используемого класса подчиненного, который работает только с этим интерфейсом частичного представления, и соответствующие части модели. Это позволит вам избежать переписывания кода презентатора для перевода из модели каждый раз, когда вам понадобится использовать элемент управления, а также предотвращает необходимость представления представления о модели в окне для передачи информации презентатору элемента управления.
Что это эффективно делает, так это то, что он дополнительно отделяет пользовательский элемент управления как модуль от вашей модели данных. Это имеет смысл, если вы рассматриваете пользовательский элемент управления в целом как элемент реализации представления. Как единица многократного использования, она представляет собой часть функциональности представления, и ни одна ее часть не должна быть привязана к вашей модели данных.