C# 试图理解MVC。是这样吗?

C# 试图理解MVC。是这样吗?,c#,model-view-controller,events,design-patterns,chess,C#,Model View Controller,Events,Design Patterns,Chess,解释它的方式是通过使用事件和发布/订阅模型。基本上,模型只是数据,它不知道视图/GUI/UI。模型通常只是一个对其数据进行操作的抽象对象,可以执行操作等等 视图是一个不同的类,它响应模型中的更改,通常向用户显示此数据。以前,我不知道在视图和模型之间没有耦合的情况下,这是如何发生的,但是用事件解释它可以消除很多混淆。这是否意味着模型包含在发生有趣的事情时自身引发的公共事件?例如,如果我们正在编写一个国际象棋游戏,当一个棋子被移动时,模型将引发“棋子移动”事件,并提供必要的信息,例如从哪个棋子、从哪

解释它的方式是通过使用事件和发布/订阅模型。基本上,模型只是数据,它不知道视图/GUI/UI。模型通常只是一个对其数据进行操作的抽象对象,可以执行操作等等

视图是一个不同的类,它响应模型中的更改,通常向用户显示此数据。以前,我不知道在视图和模型之间没有耦合的情况下,这是如何发生的,但是用事件解释它可以消除很多混淆。这是否意味着模型包含在发生有趣的事情时自身引发的公共事件?例如,如果我们正在编写一个国际象棋游戏,当一个棋子被移动时,模型将引发“棋子移动”事件,并提供必要的信息,例如从哪个棋子、从哪里移动到哪里等。视图可以订阅此类事件,然后显示棋子从其旧方格移动到新方格的动画

仍然让我困惑的是控制器的确切性质。我很难理解它是如何为模型和视图提供新信息的。我想象控制器包含对模型和视图的引用。按照国际象棋的例子,控制器是否只响应用户输入(例如移动棋子),然后向模型建议棋子要移动到哪里?然后模型获取这些信息,查看它是否是合法的移动,如果是,则相应地更新模型,引发PieceMoved事件,视图对此作出反应并相应地更新图形领域


最后,控制器如何确定要移动的工件?这类东西似乎与视图紧密相关,比如说移动,首先单击要移动的部分,然后单击目标方块。我想象控制器会响应鼠标点击并将这些坐标发送到模型,但是模型如何知道如何转换这些坐标以找到选择的工件?这不是与风景紧密相连吗?看起来视图必须执行一些逻辑处理,而不是简单地响应模型和控制器,但是它不再是一个合适的视图,而是一个视图/模型的组合。

MVC是一个非常通用的概念。它有很多不同的实现方式,其中大多数都有这样或那样的折衷

我看到的问题是,您试图采用一个深奥的概念,并对其应用具体的实现细节。这是很难做到的,除非你考虑到一个非常具体的实现asp.net MVC、fubuMVC、spring MVC、smalltalk MVC等等,而且每一个都以不同的方式完成通知和事件处理等任务

如果您只是在谈论MVC概念,那么您必须以一种通用的方式处理MVC概念。我知道,如果您有一个具体的实现,那么可能更容易理解,但是接下来您将在理解实现的基础上理解模式MVC,这可能会扭曲您对模式本身的理解

因此,当您阅读有关消息或事件的信息时,您必须只考虑一些实现定义的机制。它可以是一个回调,也可以是一个C事件,也可以是一条Windows消息,也可以使用force

编辑:


关于你的更新,我将重复。您无法回答有关一般概念的特定于实现的详细信息。您必须定义一个特定的实现,以便有人能够告诉您这些实现细节是如何完成的。

因此,如果您有一个棋盘视图和一个棋盘控制器,控制器将为其存储事件。移动工件时,将引发PieceMoved事件,该事件将向该事件传递信息,如当前位置和所需位置


对于一个非常简单的应用程序,您可能无法理解模型的概念。一个可能有一个计费模型,可以在多个视图(如详细信息视图和创建视图)上重用。您不希望每次需要时都复制此代码,因此在控制器中,每个事件都会接触到需要它的计费模型。通过创建模型,您就是在封装代码。

这个问题有很多答案,主要是因为有太多不同的MVC框架。请看一些例子。我也可以给出一个MVVM的观点,主要是因为这是我这些天一直在做的事情,所以这就是我的想法

模型层基本上是您的数据和业务逻辑。您可能正在这里与数据库或Web服务交谈。如果您最终编写了一个系统,这不仅仅是一个GUI,这是您的可重用代码

然后,ViewModel位于模型的顶部,基本上以属性的形式呈现数据。它使用IN otifyPropertyChanged接口,用于在数据更改时通知UI。如果在将数据推送到模型层之前,您有用于构建某个对象的数据,那么它就存在于此。您通常会将可以在UI中执行的操作公开为ICOMNAND

视图层是耦合最少的,因为它只使用绑定连接到ViewModel。要可视化的内容是与用于更改其形式的可选转换器绑定的属性,例如

Visibilty="{Binding IsVisible, Converter={StaticResource booleanToVisibiltyConverter}}"
动作UI元素绑定到ViewModel上的命令以启动ViewModel动作

Command="{Binding DoSomething}"

MVC模式的缺点是:

每个人都有自己的看法 这是一个有点抽象的概念 好处是:

其实很简单 这是一种划分大多数应用程序的奇妙方式 要回答您的问题,请执行以下操作:

模型

这是一个简单的问题。模型应该只知道自己。这是棋盘、棋子和游戏规则。如果您可以在桌面应用程序或web应用程序中重用模型,您就知道您构建的模型是正确的

景色

这也不复杂。它是视觉部分,是处理用户输入的部分。要理解视图在MVC模式中的作用,最重要的概念是它们必须提供一种方法来调用系统的puclic接口。在国际象棋游戏中,它必须绘制元素并检测用户使用鼠标/键盘所做的事情。当用户执行某项操作时,视图负责调用系统:例如,User1希望将工件从X移动到Y重要:大多数情况下,您不希望视图触发调用,如User1在坐标X,Y中单击。像素是视图的领域。系统必须接收与图形表示方式无关的订单

控制器

你说得对,这一个不是那么直截了当的。控制器必须处理对系统公共接口的调用。在您的示例中,它将接收一个调用“User1从X移动到Y”,并在模型的appropiate对象中调用一个方法,在这种情况下很可能是board。因此,控制器完全了解模型中的对象。但是,它也可以包含应用程序中必需但不属于模型域的代码。您必须检查用户是否具有访问系统的权限?你必须把那个电话记录到一个文件里吗?大多数情况下,这类事情都会进入控制器


然而,这只是我自己的MVC版本,我和其他人一样,也有自己的版本…:

长长的问题和完整的答案会更长。先读几本书。不是完全离题,而是太宽泛了。我会尽量让问题更具体、更简短。好吧,希望这样更好。