我的UWP项目遵循MVVM模式(或者它应该最少)并且我正在重构它,因为它遭受了“上帝视图模型”问题:页面视图模型基本上做了所有事情,这真的很难维护。
目前,典型的页面视图模型可以完成以下任务:
ICommand
实现的DelegateCommand
属性,这些属性在我的页面viewmodel上调用方法。这些方法更改了子视图模型中的一些内容,并通过调用存储库来保留更改。EventAggregator
上发布的事件。它可能会收到ModelChangedEvent
或ModelAddedEvent
等事件,这些事件是由第三方更改模型时由持久层创建的。如果页面视图模型接收到这样的事件,则视图模型将更新正确的子视图模型。所以我有这个架构:
+-------------------------+
| Page |
+-------------------------+
| binds to properties
| calls commands
\|/ subscribes to changes from external
+-------------------------+---------------------------------------+
| PageViewModel | ----------------------- |
+-------------------------+ | |
| creates | |
\|/ updates gets models | |
+-------------------------+ stores models | |
| ContentViewModel | | |
+-------------------------+ | |
| wraps around | |
\|/ \|/ |
+-------------------------+ loads +----------------------+ |
| ContentModel | <--------- | IContentRepository | |
+-------------------------+ stores +----------------------+ |
| notifies of |
| changes |
\|/ |
+----------------------+ |
| IEventAggregator |<-+
+----------------------+
我希望通过将PageViewModel
放入他们自己的文件并更改从Commands
收到的更新的处理方式来重构“类神”EventAggregator
。但我对此有几个问题:
让我们假设有一个AddContentCommand
应该创建一个新的ContentModel
实体并立即将其存储在数据库中。是AddContentCommand
是否应注入IContentRepository
并通过调用存储库来持久保存新对象?或者应该在PageViewModel
上完成?如何通知PageViewModel
添加?这应该通过从PageViewModel
调用AddContentCommand
上的某个方法直接完成,还是应该通过EventAggregator完成? AddContentCommand
甚至可以引用PageViewModel
吗?
如果每个ContentViewModel订阅了IEventAggregator上的更改并相应地自行更新,是否会出现问题?或者,如果PageViewModel订阅它并告诉依赖视图模型更新,它是否更好,就像现在这样做?