我在C++/WinRT中设置了一个非常简单的(通用Windows(应用程序。现在只是App <- MainPage <- DataViewModel <- Data
。MainPage
具有一些Slider等,它们被绑定(x:Bind
(到包含Data
的实例的DataViewModel
。到目前为止工作良好。
然而,Data
是DataViewModel
的成员。这似乎是一种明显的代码气味数据不应该是";拥有";通过GUI。不过,我遇到的所有示例/示例似乎都是这样设置的。
我还想运行一个后台线程(纯C++代码(,它与Data
的一个相同实例一起工作。
问题:谁"拥有";Data
。我如何连接事物?如何传递引用
到目前为止,我的最佳想法是:App
类本身应该只拥有Data
的一个实例。MainPage
的ctor应该取一个Data&
并将其传递给DataViewModel
的ctor。然而,我似乎无法为MainPage
编写自定义的ctor,因为这涉及到生成的代码。
只要给我指一个编码良好的示例应用程序也将不胜感激
IInspectable(在上面的评论中(提出了一个值得注意的点:;只有当涉及到非静态生存期时,所有权才真正重要。如果Data表示具有静态生存期的数据,那么通过静态应用程序类成员公开它本身并没有什么问题">
在这种情况下,不要将你对Data
(即模型(的思考局限于其他对象所拥有的对象。该模型应被视为一个完全独立的组成部分。
让我从另一个角度来看待这个概念。大多数人很容易将MVVM描述为三个独立的";层";或";部件";或者你有什么;不在乎";关于视图模型;不在乎";关于视图**在代码中(正如您自己所看到的(,您可能会发现一些清晰的所有权模式来反映这一基本前提。例如,如果我们遵循";视图优先";方法类似于Microsoft示例,您将从您的应用程序对象开始,该对象拥有视图对象的实例,而视图对象又实例化了视图模型实例。
但MVVM的关键不是谁拥有谁,而是这些层之间的关系。如果你愿意的话,你可以写一个程序,比如说,视图和视图模型都是应用程序类的静态成员,并且一旦一切都连接起来,仍然有一个(概念上(教科书式的MVVM结构。从这个角度来看,所有权在哪里并不重要。
现在,像照片编辑器这样的微软示例的问题是,它们最终只是事物如何工作的演示,而不是关于设计模式的论文。请考虑您的数据何时来自数据库或web服务。模型和视图模型之间的概念线在哪里绘制?这个问题听起来可能很迂腐,但你评估这些东西的方式会影响你的设计决策。
这让我回到你的具体问题上来。如果当你在网上找到的例子把模型数据粘贴到任何旧的地方时,你觉得代码有味道,那么你没有错。在";现实生活;模型可以是一个完整的API,而不仅仅是一个说明性的类。您可能会有一个复杂的子系统向您提供数据,该子系统依赖于与应用程序完全分离的服务。或者它可能是一个不透明的第三方API,你正在通过全局函数等调用;所有权;这是(概念上的(";关系">***
**作为旁注,您提到Data
是DataViewModel
的成员,并将其描述为Data
是"由GUI拥有"理想情况下,视图模型应该与UI没有固有的联系,只有应用程序逻辑。不要把它看作是UI功能的扩展。
***但请不要在这篇文章中暗示MVVM范式的实际实现并不重要。任何设计模式都是如此。实现的具体形式取决于具体的应用程序以及老板希望你做的事情。我想说的是,不要为所有权而烦恼。:(