MVVM中的模型:业务对象还是其他东西?

13 浏览
0 Comments

MVVM中的模型:业务对象还是其他东西?

我正在努力理解MVVM,所以我阅读了一堆文章——大多数关注的是View -> ViewModel的关系,人们对于各自的含义有一致的认识。ViewModel -> Model的关系以及什么构成了Model则得到的关注较少,观点存在分歧。我感到困惑,希望能得到帮助。例如,这篇文章将Model描述为一个业务对象,而这篇文章则描述了一个管理业务对象的类。这两种观点是否正确,还是说有其他解释?

0
0 Comments

在MVVM模式中,ViewModel的价值来自于协调。ViewModel应该作为视图和模型之间的协调者,而不应该包含业务逻辑,而是与业务服务进行交互。例如,如果一个视图是一个小部件列表,这些小部件是从一个服务中获取的,那么可以这样描述MVVM模式的实现:

Model是一个List

View是一个绑定到ViewModel属性Widgets的ListBox;

ViewModel暴露属性Widgets,并且拥有一个IWidgetService的引用,可以通过调用该服务获取Widgets。

在这种情况下,视图与业务对象进行协调,因此视图不需要了解业务对象的任何信息。模型应该独立于它们的使用方式,不知道视图模型、视图或其他任何东西的存在。IWidgetService可以通过依赖注入容器(如Unity的构造函数注入或使用MEF的导入)绑定到视图模型上。

希望这样解释清楚了。不要过度使用视图模型,将其视为了解业务对象和模型的协调者,但不了解视图或业务流程的执行方式。

0
0 Comments

MVVM模式中的模型(Model)通常被定义为表示业务逻辑和数据的对象,而视图模型(ViewModel)则负责将模型的数据转换为视图可以使用的格式。然而,关于ViewModel和Model之间的关系并没有明确的定义,这取决于项目或软件的需求,以及代码结构的可维护性和可重用性的重要性。

将ViewModel和Model分离只是一种代码结构的方式,具体如何分离取决于项目的需求。这种分离可以简化和使独立的代码部分可重用。当你有了清晰分离的业务数据、业务逻辑和展示逻辑后,你可以轻松地组合、匹配和重用视图、逻辑和数据来创建新的用户界面。此外,经过分离和简化的代码通常更容易理解、测试、调试和维护。

然而,并不是每个人都同意这种分离方式。你需要权衡将ViewModel和Model分离带来的优势和成本,并意识到在ViewModel和Model之间进行划分并不总是一项简单的任务。最好制定一些规则来指导你或组织的开发,并根据问题领域的需要来逐步演进这些规则。

值得一提的是,对于Windows Forms的开发者来说,使用MVVM类似的模式并不陌生。而WPF在数据绑定和命令方面提供了更直接的支持,这使得开发者的工作更加轻松。

另外,虽然你应该让代码具有可重用性和独立性,但是如果将ViewModel和Model混合在一起能够满足需求的话,这种混合并不是不可取的。然而,如果你的模型需要在其他应用程序中重用,将WPF特定的行为(如INotifyPropertyChanged)与模型混合在一起可能会限制其可重用性。

总之,ViewModel和Model的分离与否取决于需求和要求。没有一个简单的方法来解释如何进行分离,这需要经验和对编写良好结构化代码的理念,并且还要考虑时间和截止日期等因素。不同的情况可能有不同的观点和做法,这些观点和做法都是合理的。

最后,值得一提的是,我在Windows Forms和WPF模型中都使用了INotifyPropertyChanged,并在合适的情况下也使用了ObservableCollection。虽然这可能不是完美的关注点分离,但是在实践中,我发现这种方法非常有效,并且能够按时完成工作。

0
0 Comments

在MVVM模式中,"model"这个术语的含义因人而异,因此有时会造成混淆。对于我来说,从WCF服务返回的业务对象是我认为的"model"。因此,我的项目没有那种漂亮的文件结构,即包含*.Models、*.ViewModels和*.Views的命名空间。我个人认为从业务逻辑返回的对象或类似的对象是"model"。

有些人倾向于将业务对象和业务逻辑混为一谈,并将其称为"Model",但我认为这有点令人困惑,因为我认为模型比业务逻辑更加静态,但这只是语义上的区别。

因此,当你查看MVVM项目的示例时,如果没有清晰地看到"Model",那只是因为不同的人对待"Model"的方式不同。除非一个应用程序非常独立,否则如果看到一个实际的*.Model命名空间,我会非常怀疑这个应用程序。

另一个很重要的事情是,很多时候你已经在这些类型的业务对象上投入了很多精力,我认为很多人看到"MVVM"就立即认为他们需要开始定义"M",尽管他们已经拥有的东西完全可以。

Model和ViewModel之间的混淆也是很常见的。本质上,如果我需要数据和行为的组合,我知道我需要一个ViewModel。例如,我不会期望在Model上实现INotifyPropertyChanged,但在ViewModel上会期望。

我认为你的回答一直很好,直到最后。我不太明白为什么你不希望在模型上实现INotifyPropertyChanged?我经常在模型上实现这个,否则你希望如何通知多个视图对核心业务数据的更改?(例如,你的模型可以是一个Employee类。如果某个实例的Employee.Name发生了更改,你希望视图/视图模型能够收到通知)。

因为这是一种行为。模型不需要与特定于视图的行为相关联。这不是模型的职责。例如,如果你创建一个WCF服务引用,那些对象没有实现INotifyPropertyChanged。如果你需要那种级别的行为,你可以将该类型实现为ViewModel。

这并不意味着这不是一个常见的问题。普遍的观点是,你的Model应该与WPF的关系很少(这样它在非WPF环境中可重用等)。关于这个主题在Stack Overflow上有很多讨论:1) stackoverflow.com/questions/839118/… 2) stackoverflow.com/questions/772214/… 3) stackoverflow.com/questions/857820/…

0