Добрый день.
Занимаюсь изучением CAB, Smart Client и т.д.
У меня возникает вопрос: в паттернах MVC и MVP модель (в CAB — это, я так понял, — WorkItem) и View (SmartPart) — разорваны, т.е. модель не знает о вью и наоборот. Во всех же примерах модель не просто знает о вью — но и сама создает его, а вью зачастую создает экземпляры модели. Либо я неправильно разобрался в терминологии либо одно из двух...
В чем тут дело, подскажите плиз.
24.07.07 19:00: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, baranovskiyne, Вы писали:
B>Добрый день.
B> Занимаюсь изучением CAB, Smart Client и т.д.
B> У меня возникает вопрос: в паттернах MVC и MVP модель (в CAB — это, я так понял, — WorkItem) и View (SmartPart) — разорваны, т.е. модель не знает о вью и наоборот. Во всех же примерах модель не просто знает о вью — но и сама создает его, а вью зачастую создает экземпляры модели. Либо я неправильно разобрался в терминологии либо одно из двух...
B>В чем тут дело, подскажите плиз.
Привет,
WorkItem в CAB — это контейнер компонентов (компонентами может выступать практически всё начиная от воркспейсов, смартпатов, сервисов и т.д., заканчивая другими воркайтемами, которые являются дочерними к данному). Главная цель контейнеров (в контексте CAB — WorkItem) — это сделать так, чтобы объекты, которые тесно взаимодействуют друг с другом (это могут быть Views, которые отображают информацию, Presenters, которые управляют этими Views, сервисы, которые необходимы для работы этих Presenters и Views) создавались и уничтожались одновременно. Т.е. WorkItem не есть модель.
Моделью в конетксте CAB может выступать States, которые есть у этого WorkItem'а. Но ты так же можешь создать сервис, к которому будешь обращаться за получением и обновлением данных.
Далее, создание.
Что происходит, когда запускается приложение CAB:
— инициализация сервисов CAB
— создание RootWorkItem, который является главным WorkItem'ом приложения
— конструируется Shell — главная форма приложения
— вызывается метод AfterShellCreated() у ShellApplication, в котором можно инициализировать необходимые States, Workspaces, UI Elements и др.
— загружаются модули, прописанные в ProfileCatalog.xml (зависит от реализации)
— для каждого модуля встраивается WorkItem и вызывается метод Load() у класса, производного от ModuleInit
А дальше твой модуль может отображать виды в вокрспейсы, и проводить необходимую инициализацию.
Получается что WorkItem знает о смартпатах, которые ему надо создать, он их создаёт. А SmartPart знает о своём Presenter'е.
Здесь по рекомендации Microsoft следующая зависимость:
— ConcreteView реализует интерфейс IConcreteView
— View знает о своём ConcretePresenter и может создавать его экземпляр
— при создании ConcretePresenter, свойству ConcretePresenter.View устанавливается ConcreteView, который его создал
— в свойство WorkItem у ConcretePresenter инжектится WorkItem, создавший ConcreteView
Т.е. с презентером ты можешь общаться напрямую, а вот презентер ко View стучится через интерфейс. Это существенно облегчает unit-тестирование, потому что вместо реального ConcreteView ты можешь какой-нить фейк впихнуть.
Но это только рекомендации.
Мда.. написал много.
В кратце: WorkItem — не модель. И презентер может общаться с WorkItem напрямую. Так же он может получить необходимые сервисы через ServiceDependency.
Ну и общение между Views лучше проводить через презентеры через Publish/Subscribe.
Надеюсь, всё доступно объяснил
ПС>View знает про model.
ПС>P. S. Говорят не «разорваны», а «развязаны» («decoupled»).
Разве в MVP view знает про model? View знает только про Presenter, да и то, учитывая IoC, знает очень мало.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Predicate, Вы писали:
ПС>>View знает про model.
P>Разве в MVP view знает про model? View знает только про Presenter, да и то, учитывая IoC, знает очень мало.
Я имел в виду именно MVC. А «MVP» у меня прочно ассоциируется с «most valuable professional», а не с «model-view-presenter»

.
Здравствуйте, Predicate, Вы писали:
P>Разве в MVP view знает про model? View знает только про Presenter, да и то, учитывая IoC, знает очень мало.
В MVP модель не знает ни о ком, Presenter знает View но только через интерфейс IView (IoC), View же ничего не знает о презентере, и общается через события, на которые Presenter подписан.
В MVC знает или не знает о модели View зачисит от того активный View или нет.
... << RSDN@Home 1.2.0 alpha rev. 673>>