Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# MVC、MVP和;基于c语言的MVVM设计模式#_C#_Design Patterns_Model View Controller_Mvvm_Mvp - Fatal编程技术网

C# MVC、MVP和;基于c语言的MVVM设计模式#

C# MVC、MVP和;基于c语言的MVVM设计模式#,c#,design-patterns,model-view-controller,mvvm,mvp,C#,Design Patterns,Model View Controller,Mvvm,Mvp,如果我们使用短语“MVC、MVP和MVVM设计模式之间的差异”搜索Google,那么我们可能会得到一些URL,其中讨论: MVP 在无法通过“dataContext”进行绑定的情况下使用。 Windows窗体就是一个很好的例子。为了将视图与模型分离,需要一个演示者。由于视图不能直接绑定到演示者,因此必须通过接口(IView)将信息传递给视图 MVVM 在可以通过“dataContext”进行绑定的情况下使用。为什么?每个视图的各种IView接口都被删除,这意味着需要维护的代码更少。 一些示例中,

如果我们使用短语“MVC、MVP和MVVM设计模式之间的差异”搜索Google,那么我们可能会得到一些URL,其中讨论:

MVP

在无法通过“dataContext”进行绑定的情况下使用。 Windows窗体就是一个很好的例子。为了将视图与模型分离,需要一个演示者。由于视图不能直接绑定到演示者,因此必须通过接口(IView)将信息传递给视图

MVVM

在可以通过“dataContext”进行绑定的情况下使用。为什么?每个视图的各种IView接口都被删除,这意味着需要维护的代码更少。 一些示例中,MVVM可以使用Knockout包含WPF和javascript项目

MVC

在视图和程序其余部分之间的连接不总是可用的情况下使用(并且您不能有效地使用MVVM或MVP)。 这清楚地描述了web API与发送到客户端浏览器的数据分离的情况。Microsoft的ASP.NET MVC是管理此类情况的绝佳工具,它提供了一个非常清晰的MVC框架


但我还没有找到一篇文章从理论上和示例代码一起讨论这种差异

如果我能得到一篇讨论这3种设计模式(MVC、MVP和MVVM)之间的差异以及代码的文章,那就太好了

我想获得3个类似的CRUD应用程序的源代码,它们已经通过这三种设计模式(MVC、MVP和MVVM)实现。因此,我可以通读代码,了解应该如何为这三种设计模式(MVC、MVP和MVVM)编写代码


因此,如果有任何这样的文章讨论了这3种设计模式(MVC、MVP和MVVM)的代码看起来有什么不同,那么请将我重定向到这篇文章。

一些基本的差异可以简而言之:

MVC:

传统的MVC是一个

  • 模型:用作数据的模型
  • 视图:处理用户的视图,该视图可以是UI
  • 控制器:控制模型和视图之间的交互,其中视图调用控制器来更新模型。如果需要,视图可以调用多个控制器 MVP:


    与传统的MVC类似,但控制器被Presenter取代。但与控制器不同,演示者也负责更改视图。视图通常不调用演示者

    MVVM

    这里的区别在于视图模型的存在。它是一种观察者设计模式的实现,其中模型中的更改也由VM在视图中表示。
    例如:如果滑块被更改,不仅模型会被更新,视图中显示的可能是文本的数据也会被更新。因此,存在双向数据绑定

    链接中的精彩解释:

    我们先来看看MVC

    输入首先指向控制器,而不是视图。该输入可能来自与页面交互的用户,但也可能来自简单地在浏览器中输入特定url。在这两种情况下,它都是一个控制器,与之接口以启动某些功能

    控制器和视图之间存在多对一关系。这是因为单个控制器可能会根据正在执行的操作选择要渲染的不同视图


    从控制器到视图有一个单向箭头。这是因为视图不知道或不引用控制器

    控制器确实会传回模型,因此视图和传递到视图中的预期模型之间存在知识,但提供模型的控制器却不存在知识

    MVP–模型视图演示者

    现在让我们看看MVP模式。它看起来与MVC非常相似,只是有一些关键区别:

    输入从视图开始,而不是从演示者开始

    视图和关联的演示者之间存在一对一映射

    视图包含对演示者的引用。演示者还对从视图触发的事件做出反应,因此它知道与其关联的视图

    演示者根据对模型执行的请求操作更新视图,但该视图不支持模型

    MVVM–模型视图模型

    因此,随着MVC和MVP模式摆在我们面前,让我们看看MVVM模式,看看它有什么区别:

    输入从视图开始,而不是从视图模型开始


    当视图包含对视图模型的引用时,视图模型没有关于视图的信息。这就是为什么在不同的视图和一个视图模型之间有一对多的映射是可能的…甚至是跨技术的映射。例如,WPF视图和Silverlight视图可以共享相同的视图模型。

    MVC、MVP、MVVM

    MVC(旧的)

    MVP(由于其低耦合性而更加模块化。Presenter是视图和模型之间的中介)

    MVVM(VM和UI组件之间已经有了双向绑定,因此它比MVP更自动化)

    另一幅图像:

    下图出自欧文·范德瓦尔克的著作:

    解释了这些差异,并给出了一些C#

    MVP:

    优势:

    演示者将出现在模型和视图之间。演示者将从模型中获取数据,并根据视图的需要对数据进行操作,然后将数据交给视图,而视图只负责渲染

    缺点:

    1) 我们不能将presenter用于多个模块,因为一个视图类正在presenter中根据需要修改数据

    3) 打破清洁建筑