Раньше мои взгляды общались с их докладчиками, но они отошли от этого. Он не соответствует первоначальному определению шаблона (сам по себе не является причиной отклонения только способствующего фактора для получения этих преимуществ). В идеале представления должны быть как можно более тупыми и иметь как можно меньше зависимостей. View должен общаться с Presenter (любыми «наблюдателями») через делегатов / события / какой-то механизм «запускай и забывай». На самом деле, я ввел контроллер в MVP специально для перехвата событий View и либо перезапуска докладчика (редко) для связи с Presenter, либо для связи с системой или шиной событий, специфичной для Presenter - что позволяет мне изменить механизмы оповещения о действиях пользователя, не касаясь вида. Должны быть осторожны с шиной событий, хотя; довольно скоро вы начинаете добавлять туда все события, приложение начинает болтать / увязать в обработке событий, а события - не самые быстрые вещи в .Net. Сунхронизация - это дополнительная проблема, особенно если вашему приложению требуется более «диалоговое» взаимодействие с вашим пользователем.
Следует иметь в виду, что, хотя Presenter является обычным представлением / специфичным для процесса, представления (и модели представлений) могут использоваться повторно; наличие представления в отношениях сдерживания / делегирования с докладчиком сильно связывает представление / ограничивает его повторное использование. Это может быть уменьшено некоторыми DI, но я нахожу DI-контейнеры ненужной сложностью в большинстве случаев (поскольку мне все равно нужно знать, как создавать объекты и как часто вы заменяете объект на другой семантически похожий объект после его создания / тестирования). ?). Конкретная зависимость не идет никуда, кроме другого слоя / добавляет больше неясности / усложняет отладку / трассировку. Впрочем, в последнее время мы были в «простоте», и в большинстве своем предпочитаю делать сопоставления на объектах / созданиях объектов / ORM для большинства приложений, так как обычно используются таблицы / сущности «1-к-1» между двумя базами данных и не требуется добавление Сложность универсального стороннего инструмента ORM, который в силу общего контекста / необходимости обслуживать разные приложения должен усложнять работу, даже если вы понимаете, как они работают (не в этом суть).
Более того, для View все еще вполне возможно наблюдать Модель в MVP (как в MVC), поэтому я не буду так быстро исключать это. Я не предпочитаю делать это сам, но это «не нарушает» шаблон. Фактически, я разработал нечто похожее на MVP около десяти лет назад, потому что мне не нравился «круговой цикл» между компонентами MVC (View, зная о Model); Я предпочел иметь более чистое разделение между View и Model, которое исповедуют все эти шаблоны (включая MVC), а также желание сохранять View как можно более тупым (наблюдение за Model будет означать, что View потребуется больше интеллекта для обработки изменений в модели). В итоге я сделал что-то вроде MVVM и паттерна стратегии, где я использовал «подструктуры» модели для передачи в View, выступая в качестве «уведомителей об изменениях». Это позволяло видеть все цели для конкретных целей и гибко / многоразово (жесткая комбинация).