在MVVM中访问存储库的正确位置

时间:2018-02-17 16:22:18

标签: mvvm architecture command

我的UWP项目遵循MVVM模式(或者它应该最少)并且我正在重构它,因为它遭受了“上帝视图模型”问题:页面视图模型基本上做了所有事情,这真的很难维护。

目前,典型的页面视图模型可以完成以下任务:

  • 它处理页面导航到的初始化:它从存储库中获取模型并创建视图模型,这些视图模型“环绕”我的业务层模型并将它们公开给具有属性的视图。
  • 它公开了使用ICommand实现的DelegateCommand属性,这些属性在我的页面viewmodel上调用方法。这些方法更改了子视图模型中的一些内容,并通过调用存储库来保留更改。
  • 它会侦听在EventAggregator上发布的事件。它可能会收到ModelChangedEventModelAddedEvent等事件,这些事件是由第三方更改模型时由持久层创建的。如果页面视图模型接收到这样的事件,则视图模型将更新正确的子视图模型。

所以我有这个架构:

+-------------------------+
| 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订阅它并告诉依赖视图模型更新,它是否更好,就像现在这样做?

0 个答案:

没有答案