Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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
C# MVVM相对于MVC的优势_C#_Silverlight - Fatal编程技术网

C# MVVM相对于MVC的优势

C# MVVM相对于MVC的优势,c#,silverlight,C#,Silverlight,最后,我做了一些Silverlight开发,遇到了MVVM。我对MVC很熟悉,我在读的文章中说,因为XAML,MVC不起作用。在XAML方面没有太多经验显然是我没有得到这一点的原因 有人能解释为什么MVC不适合,为什么MVVM更适合Silverlight开发吗 谢谢 JD这是一个非常细微的区别,我可以通过比较ASP.NET中的MVC和WPF中的MVVM来最好地解释这一点 在ASP.NET MVC中,请求来自web服务器,由控制器直接处理。控制器确定适当的视图并用模型填充该视图。然后,控制器将这些

最后,我做了一些Silverlight开发,遇到了MVVM。我对MVC很熟悉,我在读的文章中说,因为XAML,MVC不起作用。在XAML方面没有太多经验显然是我没有得到这一点的原因

有人能解释为什么MVC不适合,为什么MVVM更适合Silverlight开发吗

谢谢
JD

这是一个非常细微的区别,我可以通过比较ASP.NET中的MVC和WPF中的MVVM来最好地解释这一点

在ASP.NET MVC中,请求来自web服务器,由控制器直接处理。控制器确定适当的视图并用模型填充该视图。然后,控制器将这些实例释放到底层系统,底层系统将结果呈现给客户端。您可以看到控制器是第一个也是最后一个动作

在MVVM中,UI(视图)面向用户并直接接受用户输入。在视图中,ViewModel(视图的DataContext)中的命令由此活动触发。控件流到ViewModel,后者解释视图发送给它的内容并准备其模型。控制流回到视图后,它会根据模型中的更改进行自我更新。如果需要新视图,ViewModel将与NavigationService(或应用程序使用的任何导航方法)进行通信,NavigationService是窗口或框架UI组件的权限。您可以看到,ViewModel并不是第一个也是最后一个动作;视图在MVC中的作用要大得多


WPF/Silverlight的体系结构就是这样做的原因。指挥、绑定和导航基础设施不能由控制器控制/替换;它们与UI紧密集成。因此,控制器必须坐在视图下面,扮演更被动的角色。

我认为MVVM比MVC更适合XAML。说MVC“不适合”有点夸张


为什么MVVM更好?这主要是因为XAML中出色的数据绑定和命令绑定。看

MVVM的设计主要是因为XAML,为了使数据绑定更加简单,它与MVP非常相似。主要的好处是操作用户界面的方式更简单(ViewModel或Presenter负责该任务,而不是模型在被控制器操作后向视图触发事件)


帮助我理解这些原则的最好的两篇文章是和

我认为另一个好处是学习曲线。由于前端技术中的大多数开发人员都使用了MVVM类型的编码风格,因此他们更容易采用相同的编码风格,而不是使用控制器模型,在控制器模型中,他们需要将每个请求从视图传递到控制器,并使其与模型通信。

解耦组件

在MVC中,组件之间存在三角形关系。即:控制器拥有视图和模型。视图依赖于模型的定义。模型需要满足视图的要求。考虑一个中心(控制器)和分支架构(视图和模型)

在MVVM中,考虑三角形变平,每个组件只知道链中的另一个组件。即:视图->视图模型->模型

模型不知道堆栈中的任何内容。 ViewModel只知道该模型 视图只知道视图模型-它不知道模型

为什么这很重要?

这是原问题的核心

主要目的是进一步抽象您的体系结构。这通常会导致更多的代码,但对象之间的接触点更少。较少的接触点很重要,因为这会导致更敏捷的代码。A类与B类的耦合/接触越多,A类变化的影响就越大。减少变更的影响是良好体系结构的关键好处之一

要完全理解这一点,思考组件真正代表什么是很有帮助的。什么是视图、控制器、视图模型或模型?它们是字面上的定义,还是更抽象的概念

在我的经验中,将模型看作是处理数据的构造和持久性的类/对象的集合更为有益。它不仅仅是一个具有属性的普通旧对象。它是一个执行数据获取、数据保存的类,一个构造普通旧对象的工厂。它是一个facade层,为数据提供了一个清晰的API。该立面层是否应直接从视图中引用

在我看来,这不应该。在MVC中,答案也是“不”。控制器从模型中获取数据。在这方面,MVC和MVVM实现了相同的目标。这两种体系结构的不同之处在于数据和视图的链接方式

与模型一样,视图可以是类的集合,这些类相互协调,呈现一个表示视图。对于移动平台,这可能包括视图控制器+视图(iOS上的视图控制器,Android上的活动)。在许多情况下,您需要一个类来将视图文档加载到内存中并更新视图属性。这里有很多工作要做。在MVC中,控制器很快就变成了一个“厨房水槽”类——一种与当前用户上下文相关的任何东西的倾倒场

当你在你的应用程序中把这些信息叠加到几十个潜在的视图上时,你的后端模型代码和前端视图代码之间会有很多深层次的依赖关系。对于大型控制器类,这些依赖关系不是很明显

消除依赖关系

MVVM使依赖关系变得平坦。这就产生了焦点。什么是焦点?在不受所有其他依赖项干扰的情况下处理单个功能的能力。