В большинстве примеров MVP, которые я видел, докладчик вызывает какую-то службу, которая вызывает некоторое хранилище, которое возвращает сущность. В большинстве веб-приложений asp.net, над которыми я работал, логика никогда не бывает такой простой. В моем последнем проекте мой докладчик назвал слой службы докладчика, который должен был прыгать через обручи, чтобы получить данные, которые должны были отображаться на экране.
Подробности: сервисный уровень запрашивает базу данных, скажем, о 8 объектах сущностей, некоторые из которых вложены друг в друга, затем код отображает эти сущности в одну огромную базу объектов вне XSD. Затем этот объект xsd был передан сторонней библиотеке, чтобы что-то с ним сделать. После того, как он вернул обработанный объект xsd, код должен был проанализировать этот объект xsd, используя класс средства форматирования представления среднего уровня, чтобы извлечь и построить то, что я называю «моделью представления» (я слышал, некоторые называют это DTO). Затем эта модель представления была возвращена из уровня обслуживания докладчику, а затем привязана к ретранслятору.
- Куда идет логика управления показом / скрытием? Должен ли он быть членом DTO или докладчик должен получить это значение? (Я выбрал его в качестве члена модели представления)
- Можно ли использовать вложенные ViewModels (DTO) или следует использовать другие пользовательские элементы управления для уменьшения сложности?
- Как правильно связать докладчика со всеми страницами / пользовательскими элементами управления, которые его используют; имеется в виду один докладчик с 5 IViews, которые требуют того же экземпляра докладчика. Должны ли пользовательские элементы управления быть автономными или они должны полагаться на «родительский» IView (страницу), чтобы предоставить ему надлежащего докладчика?
Вместо того, чтобы иметь модель представления, почему бы просто не использовать интерфейс, который реализует Страница, и передать его на сервисный уровень (через презентатора) и позволить сервису увлажнять IView? (Это может привести к тому, что сервисный уровень будет иметь ссылку на него, не так ли плохо?).
public class ViewModel
{
public bool ShowHeight { get; set; }
//Is there a bettter way to do this?
public List<NestedViewModel> NestedViewModel { get { return _nestedViewModel; } }
}