|
|
|
Как лучше добавить в WPF MVVM архитектуру свои сервисы?
|
|||
|---|---|---|---|
|
#18+
Вроде бы уже столько сказано о WPF MVVM, но тем не менее, вопрос без явного ответа. Итак, имеется набор Model и ViewModel, и между ними возникают связи. Например, мы пишем редактор, в нем будет ProjectModel - PrjectView - ProjectViewModel, и также 3 для документа. Редактируем документ, и находясь в DocumentViewModel (а может даже и в DocumentModel) нужно нам, к примеру, текст в statusBar поменять, а это находится в ведении главного окна, ProjectViewModel. Как туда пробросить сигнал? Вижу такие варианты: 1. Хранить ссылки на родительские модели и вьюмодели. Как-то некрасиво, принцип иерархии нарушается. 2. Система сообщений и агрегаторов. Неудобно, что это односторонняя связь, только сигнал в одну сторону. 3. Система сервисов. Кажется то, что нужно. Как сделать сервис? Синглетон (самопальный) - нехорошо, сложно управлять временем жизни, пусть будет сервис, который мы регистрируем в IoC-ке каком-нибудь. В любой ViewModel можем его в конструкторе через DI получить, но остается 2 проблемы: 1. Непонятно, как получать в моделе. 2. И самое непонятное : как дать сервису доступ к ViewModel, необходимой для его работы? Поясню на примере. Сделали мы IFilesService, работающий с файловой системой, ничего кроме .net- классов не использует. Это одно. А вот IStatusBarNotification уже зависим от проекта, ему нужен доступ к statusBar, находящемся в ProjectViewModel. Получается, что при регистрации этого сервиса, ему нужно указать статусную строку, т.е. сделать регистрацию в IoC мы можем только в ProjectViewModel, но где, в конструкторе что ли? Обычно все сервисы регаются задолго до этого: в Bootstraper'е. Идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 20:08 |
|
||
|
Как лучше добавить в WPF MVVM архитектуру свои сервисы?
|
|||
|---|---|---|---|
|
#18+
TopSpaceРедактируем документ, и находясь в DocumentViewModel (а может даже и в DocumentModel) нужно нам, к примеру, текст в statusBar поменять, а это находится в ведении главного окна, ProjectViewModel. Как туда пробросить сигнал?Оформи части UI, отвечающие за разные предметные области, в виде Control-ов (UserControl, CustomControl, всё равно). Связывай их между собой DataBinding-ом на уровне View. В твоём случае можно ввести базовый класс для документов (интерфейс?), содержащий свойство StatusText. "Забиндить" строку состояния на текущий документ, вероятно, не проблема. Ну если решил заморочиться с DI: TopSpace1. Непонятно, как получать в моделе.Модель не должна ничего знать про сервисы с логикой. Модель должна лишь хранить данные, может быть содержать логику, работающую только с хранящимися в ней данными. TopSpace2. И самое непонятное: как дать сервису доступ к ViewModel, необходимой для его работы?Передавать Model/ViewModel в сервисы в качестве параметров методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 06:52 |
|
||
|
Как лучше добавить в WPF MVVM архитектуру свои сервисы?
|
|||
|---|---|---|---|
|
#18+
TopSpaceСинглетон (самопальный) - нехорошо, сложно управлять временем жизни, пусть будет сервис, который мы регистрируем в IoC-ке каком-нибудь.Не сложнее, чем управлять временен жизни LifetimeScope-а диконтейнера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 07:37 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39261348&tid=1340677]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 458ms |

| 0 / 0 |
