MVVM中的数据所有权和引用(特别是C++/WinRT、UWP、WinUI)



我在C++/WinRT中设置了一个非常简单的(通用Windows(应用程序。现在只是App <- MainPage <- DataViewModel <- DataMainPage具有一些Slider等,它们被绑定(x:Bind(到包含Data的实例的DataViewModel。到目前为止工作良好。

然而,DataDataViewModel成员。这似乎是一种明显的代码气味数据不应该是";拥有";通过GUI。不过,我遇到的所有示例/示例似乎都是这样设置的。

我还想运行一个后台线程(纯C++代码(,它与Data的一个相同实例一起工作。

问题:谁"拥有";Data。我如何连接事物?如何传递引用

到目前为止,我的最佳想法是:App类本身应该只拥有Data的一个实例。MainPage的ctor应该取一个Data&并将其传递给DataViewModel的ctor。然而,我似乎无法为MainPage编写自定义的ctor,因为这涉及到生成的代码。

只要给我指一个编码良好的示例应用程序也将不胜感激

IInspectable(在上面的评论中(提出了一个值得注意的点:;只有当涉及到非静态生存期时,所有权才真正重要。如果Data表示具有静态生存期的数据,那么通过静态应用程序类成员公开它本身并没有什么问题">

在这种情况下,不要将你对Data(即模型(的思考局限于其他对象所拥有的对象。该模型应被视为一个完全独立的组成部分。

让我从另一个角度来看待这个概念。大多数人很容易将MVVM描述为三个独立的";层";或";部件";或者你有什么;不在乎";关于视图模型;不在乎";关于视图**在代码中(正如您自己所看到的(,您可能会发现一些清晰的所有权模式来反映这一基本前提。例如,如果我们遵循";视图优先";方法类似于Microsoft示例,您将从您的应用程序对象开始,该对象拥有视图对象的实例,而视图对象又实例化了视图模型实例。

但MVVM的关键不是谁拥有谁,而是这些层之间的关系。如果你愿意的话,你可以写一个程序,比如说,视图和视图模型都是应用程序类的静态成员,并且一旦一切都连接起来,仍然有一个(概念上(教科书式的MVVM结构。从这个角度来看,所有权在哪里并不重要。

现在,像照片编辑器这样的微软示例的问题是,它们最终只是事物如何工作的演示,而不是关于设计模式的论文。请考虑您的数据何时来自数据库或web服务。模型和视图模型之间的概念线在哪里绘制?这个问题听起来可能很迂腐,但你评估这些东西的方式会影响你的设计决策。

这让我回到你的具体问题上来。如果当你在网上找到的例子把模型数据粘贴到任何旧的地方时,你觉得代码有味道,那么你没有错。在";现实生活;模型可以是一个完整的API,而不仅仅是一个说明性的类。您可能会有一个复杂的子系统向您提供数据,该子系统依赖于与应用程序完全分离的服务。或者它可能是一个不透明的第三方API,你正在通过全局函数等调用;所有权;这是(概念上的(";关系">***

**作为旁注,您提到DataDataViewModel的成员,并将其描述为Data是"由GUI拥有"理想情况下,视图模型应该与UI没有固有的联系,只有应用程序逻辑。不要把它看作是UI功能的扩展。

***但请不要在这篇文章中暗示MVVM范式的实际实现并不重要。任何设计模式都是如此。实现的具体形式取决于具体的应用程序以及老板希望你做的事情。我想说的是,不要为所有权而烦恼。:(

相关内容

  • 没有找到相关文章

最新更新