【发布时间】:2011-11-02 03:01:49
【问题描述】:
根据当前的做法(至少使用 WPF 和 Silverlight),我们看到通过视图模型中的命令绑定绑定的视图,或者我们至少看到在视图模型中处理的视图事件。这似乎违反了SRP,因为视图模型不仅对视图状态建模,而且对视图(用户)做出响应。其他人问过how to build view models without violating SRP或者问过whether their implementations do so(最后这个是MVC中的控制器,但大致类似)。
那么当前的做法是否违反了 SRP?还是“视图模型”真的是不违反 SRP 的东西的集合?稍微概括一下,似乎我们需要知道什么是单一职责,或者概念中是否有多个职责,是否将各个职责分开,符合 SRP。我不确定。
Wikipedia's definition of view model 说
[T]ViewModel 是“视图的模型”,这意味着它是视图的抽象,也用于视图和模型之间的数据绑定
这对于 SRP 来说似乎已经足够了,但是后来的条目说(我的重点补充了)
[ViewModel] 充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型
在关于视图模型角色的Prism blog post 中,作者说(再次强调)
归结起来,视图模型是以下内容的组合:
- 视图的抽象
- 命令
- 价值转换器
- 查看状态
我确定我错过了很多定义,但它们似乎属于以下类别:
- 建模视图状态的单一“模糊”责任(那我们该怎么办? 意思按州)
- 多重职责(视图状态、用户交互(即 命令))
- 单个特定职责的组合(抽象、 状态、交互、转换),因此只有一个 责任:“管理所有这些东西”。
如果您好奇,我会“关心”这一点,因为 (2) 感觉不错,但似乎与流行的实现背道而驰。
【问题讨论】:
-
你知道,实际上可以在 MVVM 中让命令成为第四方,它知道 View 和 ViewModel,并且可以在两者之间进行调解。在 xaml 中编写您的虚拟机和命令时,它工作得非常好......
-
@Will - 这就是我要去的地方。在服务器端代码和 MVP 客户端中断之后,MVVM 对我来说有点新。我原以为视图会执行命令,命令会进行服务调用和操作视图模型,视图模型(通过绑定)会更新视图。
标签: wpf silverlight mvvm viewmodel single-responsibility-principle