Мне трудно понять, как лучше всего реализовать свойства интерфейса IView, которые не являются простыми типами, и мне было интересно, как другие подходят к этому в приложении Model View Presenter.
Статьи, которые я прочитал, действительно хороши, но ни одна из них, похоже, не подходит к более сложным представлениям, где у вас есть свойства List <>, которые имеют тип интерфейса, представляющий класс в вашей доменной модели, то есть IPerson или IName и т. Д. .
Я постараюсь описать сценарий как можно более кратко.
Предположим, у меня есть требование для представления, чтобы в конечном итоге сохранить список имен, каждое из которых состоит из 3 свойств: «Имя», «Фамилия» и «Заголовок».
Как правило, у меня будет модель предметной области с классом «Имя» с тремя свойствами. Эта модель предметной области будет реализовывать интерфейс (в отдельной библиотеке классов «Интерфейсы»), называемый «IName».
Теперь в пространстве имен «Views» в моей библиотеке «Interaces» у меня есть интерфейс под названием «IViewNames». Это интерфейс представления, который будет реализован любым представлением, которое в конечном итоге хочет сохранить список имен.
Как определить этот интерфейс 'IViewNames', меня удивляет. Если я даю ему свойство, подобное:
public List<IName> Names {get;set;}
тогда мой реализующий конкретный вид в конечном итоге будет иметь сложное свойство 'Names', для которого потребуется 'getter', который просматривает поля в представлении, каким-то образом создает экземпляр экземпляра 'IName', устанавливает его свойства, добавляет в список перед возвратом списка. «Сеттер» будет таким же сложным, получая список «INames» и просматривая их, устанавливая поля в представлении.
Мне кажется, что это нарушает одну из основных целей подхода MVP, заключающегося в возможности тщательного тестирования кода приложения без каких-либо конкретных реализаций View. В конце концов, я мог бы легко написать докладчика, который просматривает свойство «View.Names» и отправляет его на сервисный уровень, или устанавливает свойство «View.Names» при получении списка объектов «Name» обратно из сервиса. Слой. Я мог бы легко написать множество тестов, которые гарантируют, что все работает, все, кроме свойства COMPLEX в View.
Итак, мой вопрос: как другие подходят к свойствам IView, которые не являются простыми типами, но на самом деле являются типами вашей доменной модели? (а также типы интерфейсов, которые представляют вашу модель домена, поскольку я явно не хочу, чтобы ссылка из моего уровня представления на уровень моей модели домена).
Я более чем уверен, что существует известная методика для достижения этого элегантным способом, которая соответствует целям Model View Presenter, больше, чем мой примерный подход.
Заранее спасибо за любую помощь людям.