Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVVM、UWP&;模板10-模型与视图技术的独立性_Mvvm_Uwp_Template10 - Fatal编程技术网

MVVM、UWP&;模板10-模型与视图技术的独立性

MVVM、UWP&;模板10-模型与视图技术的独立性,mvvm,uwp,template10,Mvvm,Uwp,Template10,我对MVVM的理解是,视图负责用户表示逻辑、交互逻辑的视图模型和来自独立于UI的模型类的特定数据转换,以及从数据角度表示业务领域的模型本身 关键的一点是模型类应该是独立于UI的 这里是UWP开发模型和模板10 BindableBase,模型类应该从中派生。它非常方便,但它将模型与特定的UI实现(即UWP+模板10)联系起来 我有一个数据访问层,它将域对象直接作为模型提供给UI。这个领域相当复杂。我不想做的是在UI中重新实现data domain对象,也不想用UI特定的功能污染它 有什么想法吗 谢

我对MVVM的理解是,视图负责用户表示逻辑、交互逻辑的视图模型和来自独立于UI的模型类的特定数据转换,以及从数据角度表示业务领域的模型本身

关键的一点是模型类应该是独立于UI的

这里是UWP开发模型和模板10 BindableBase,模型类应该从中派生。它非常方便,但它将模型与特定的UI实现(即UWP+模板10)联系起来

我有一个数据访问层,它将域对象直接作为模型提供给UI。这个领域相当复杂。我不想做的是在UI中重新实现data domain对象,也不想用UI特定的功能污染它

有什么想法吗


谢谢

恕我直言,我想你可能想错了

MVVM的目标是完全按照您描述的那样分离您的逻辑。这种分离的目的是简化代码。这是否使视图模型具有可测试性和独立的关注点?对但是,我认为这些都是简单性的次要目标——简单性使代码易于管理和维护

这里有另一种说法

MVVM是一种非常适合XAML应用程序的方法。但是,如果MVVM没有使您的视图模型成为可测试的或独立的关注点,MVVM仍然是XAML应用程序的一种极好的方法,因为它大大简化了代码——更小、更简单、更独立

物有所值

您可能会争辩说,MVVM创建了另一层代码,开发人员必须理解这一层代码,然后才能对基础进行推理和贡献。我同意。但我不认为MVVM因此是不可行的。与逻辑的耦合相比,添加的层是微不足道的

现在谈谈你的问题

您的数据层对象(可能是数据传输对象)与您的UI对象(可能是模型)非常相似。开发人员的直觉迫使您通过多态性、代码生成或接口来联合类似的事情,以避免增加bug、复杂性和测试的机会

想想这个

在数据层中创建的对象是为数据层创建的。同样,在UI层中创建的对象也是为UI层创建的。结构相似性是领域相似性的副产品。当然,它们是相似的:然而,它们的意图并非如此。你为什么要合并它们

你已经看到了问题所在

唯一的区别可能是,数据层构造函数接受某种类型的数据读取器并填充属性。这对于数据层来说是完美的,但是对于UI层来说是不合适的。您的UI层可能有消息传递事件或自定义方法来处理交互。这对于UI层来说是完美的,但是对于数据层来说是不合适的

那么,相似性在哪里

我认为开发人员,包括我自己,倾向于将类似的事情视为潜在的相同。与数据相关的功能不属于UI,反之亦然。相反,你需要做的是看到它们的相似性,但要认识到它们是完全不同的对象,不应该让它们变得相同

我们很懒

重复代码与测试和bug无关。不是真的。这是关于我们,作为开发人员,是如何沉迷于“更聪明地工作而不是更努力地工作”,以至于我们往往看不起“努力工作”。如果一个对象是为一个层构建的,那么它应该位于该层中,而不是由另一个层共享。我强烈地感觉到这一点

正确的解决方案

最简单的解决方案是让您的数据在数据层上从
DataLayer.Object
序列化,然后在UI层上反序列化为
UILayer.Model
。这是最简单和最简单的方法,并充分允许您强制数据和对象API供其唯一层使用

这意味着有两个几乎相同的对象:一个在数据层,另一个在UI层。但这并不意味着存在两个完全相同的对象。它们并不完全相同,因为它们的功能对于每一层都是独一无二的

如果没有功能怎么办

有理由怀疑这是否适用于没有附加功能的对象和模型。我坚信,没有添加功能的任何层中的对象和模型都只是在等待添加该功能。如果您假设没有,并根据该假设进行构建,您将迫使您或即将到来的维护开发人员永远不要添加特定于层的功能

那有关系吗

我想是的。为什么?因为对象或模型中的特定于层的功能允许我在数据对象或模型的上下文中为我的体系结构和实现添加复杂性(而不是复杂性),而不是像
管理器
助手
实用程序
这样的外部构造。毫无疑问,
Type.DoSomething
Helper.dosomethingforttype(Type)
容易

实际上我有三个

正如您所知,我是这样做的:在我的项目中,您和我可能有相似的数据层/服务。但是,我的UI层实际上有两个模型,而不是一个。(让我们假设用户是数据类型。)我的UI层有
json.User
Models.User
json.User
是一个简单的结构,从我的服务中反序列化,并与服务对象完全匹配。但是我的UI很少需要服务API表面/结构

服务(DataLayer.User)>net>UI(json.User>Models.User)

因此,然后使用
json.User
来创建
Model.User
,它的结构正好满足我的UI层的需要,包括方法、事件和消息传递构造。我可以自由地更改我的密码