可以对模型进行任何处理吗?[MVC格式]

Can any processing be done on the model? [MVC]

提问人:Andrew G. Johnson 提问时间:12/1/2008 最后编辑:macAndrew G. Johnson 更新时间:1/3/2012 访问量:484

问:

我决定为我制作的所有新网站大力推动 MVC。我有一个关于是否可以在模型级别进行任何处理的问题。

提出这个问题的案例是一个视频网站。我有一个 Video 类(模型),当用户观看视频时,我需要做的一件事就是需要将视图记录在数据库中。我不确定是否需要在控制器中添加查询,或者是否可以在 Video 类中添加 addView 方法。

对我来说,基本的基本问题是,在模型中,我只能使用哪种方法?它可以是任何东西,还是只能是访问器(又名 getValue/setValue)方法?

模型-视图-控制器

评论


答:

2赞 tvanfosson 12/1/2008 #1

我认为您的模型正是处理此问题的地方。现在,模型必须仅由实体类组成。在我看来,你的模型将包括你的实体以及你需要实现的任何业务逻辑。控制器应该只处理视图的 I/O,调用模型方法来完成用户通过用户界面(视图)调用的操作。

0赞 D'Arcy Rittich 12/1/2008 #2

由于您可以在 MVC 中使用所需的任何模型代码(不仅限于 LINQ),因此简短的回答是肯定的。在模型中应该做什么也许是一个更好的问题。根据我的口味,我会添加一个 ViewCount 属性(它可能映射到 Video 表中的列,除非您跟踪每个用户,在这种情况下,它将位于 UserVideo 表中)。然后,您可以从控制器中递增此属性的值。

评论

0赞 tvanfosson 12/1/2008
最好实现在模型中查看视频时发生的情况。如果您希望能够观看来自多个控制器的视频,会发生什么情况?当您想要更改“查看视频”日志记录时会发生什么情况(例如,也记录当前用户的 ID)。
0赞 D'Arcy Rittich 12/1/2008
确切地说 - 如果不清楚,我说的是在模型中实现该属性。然后,可以通过在模型中创建一个名为 RecordView 或其他方法的方法将其抽象出来,并在其中递增 ViewCout 属性,以及执行可能需要执行的任何其他操作。
5赞 Mike Breen 12/1/2008 #3

Ruby on Rails 的座右铭是瘦控制器,胖模型。这不仅适用于 Rails,还应该使用任何 mvc 框架进行实践。

-1赞 Juliet 12/1/2008 #4

请记住,MVC 有很多变化,没有真正的“正确方法”来做事。归根结底,你如何设计你的课程归结为个人喜好。但是,既然您征求了设计建议,以下是我的两分钱:

业务逻辑属于控制器。将其排除在模型和视图之外。

在 MVC 模式的众多变体中,被动视图样式似乎是最容易测试的。在被动视图中,您的类设计如下:

  • 您的控制器是“智能的”:它对数据库进行更改,更新模型,并将视图与模型同步。除了对模型和视图的引用外,控制器还应保存尽可能少的状态信息。

  • 该模型是“愚蠢的”,这意味着它只保存视图的状态,而没有其他业务逻辑。模型不应包含对视图或控制器的引用。

  • 该视图是“愚蠢的”,这意味着它仅将信息从模型复制到 UI,并调用由控制器处理的事件处理程序。该视图不应包含其他业务逻辑。视图不应包含对控制器或模型的引用。

如果你是一个纯粹的 MVC 主义者,那么模型更新自身或数据库是没有意义的,因为这些职责属于控制器,因此为 Video 类创建 addView 方法是不合适的。

评论

0赞 Loki 12/1/2008
但在这个模型中,你倾向于在控制器层内生成层......它有点难以管理。
0赞 D'Arcy Rittich 12/1/2008
出于与tvanfosson相同的原因,我不同意这种方法 - 您经常从多个控制器执行相同的操作,因此将业务逻辑放在控制器中会造成混乱。
0赞 tvanfosson 12/1/2008
控制器可以调用操作来修改模型,但修改方式的逻辑封装在模型中。这会针对所有控制器对其进行本地化。它可能位于服务层或实体类中,但应该是模型的一部分。模型是数据+逻辑。
0赞 dkretz 12/9/2008
在这些情况下,至少需要将 BL 完全从数据库中抽象出来;并完成模型以执行逻辑操作。
0赞 Michael Durrant 11/25/2011
-1 我认为这是简单明了的错误。业务逻辑属于模型,而不是视图或控制器。控制器应该非常简单,如果可能的话,RESTful。对于查找器、过滤器、按用户记录等,对于所有这些模型,命名范围和其他结构就是答案。
1赞 rmeador 12/1/2008 #5

在这里,我将如何做到这一点。它应该在几乎任何语言中都有效。

View 将启动对控制器的 OnView() 方法的方法调用,然后显示控制器吐回的任何内容(当然,以受控的方式......我认为您的视图将包含一个视频播放器组件,因此您将从控制器中获取某种视频)

在控制器中,有一个 OnView() 方法,它执行 3 项操作:实例化 Video 对象(即使用数据层获取模型对象)、对 Video 对象调用 updateViewCount() 方法,以及显示视频(大概通过将 Video 对象返回给 View)。

Video 模型对象包含表示视频和所需的任何内容的数据,其中包括 updateViewCount()。这样做的理由是视频具有观看次数(聚合)。如果“视图计数”需要是一个复杂的对象,而不仅仅是一个整数,那就这样吧。根据视频对象在磁盘(数据库?)上的原始表示形式创建视频对象的数据层还将负责加载和创建相应的观看次数对象,作为创建视频的一部分。

所以,这是我的 0.02 美元。您可以看到,我已经创建了第四个东西(前三个是模型、视图和控制器),即数据层。我不喜欢模型对象加载和保存自己,因为那样它们就必须知道你的数据库。我不喜欢控制器直接进行加载和保存,因为这会导致控制器之间的代码重复。因此,一个单独的数据层,只能由控制器直接访问。

最后,以下是我查看视图的方式:用户所做的一切,以及用户看到的所有内容,都应该通过视图。如果屏幕上有一个按钮显示“播放”,则它不应该直接调用控制器方法(在许多语言中,这样做没有危险,但有些语言(例如PHP)可能允许这样做)。现在,视图的“play”方法将转过身来,在控制器上调用相应的方法(在示例中是 OnView),并且不执行任何其他操作,但该层在概念上很重要,即使它在功能上无关紧要。同样,在大多数情况下,我希望您的视图播放视频流,因此控制器返回给视图的数据将是视图所需格式的流,这不一定是您的确切 Model 对象(即使您可以直接使用 Video 对象,添加额外的解耦层也可能是可取的)。这意味着我实际上可能会让我的 OnView 方法采用一个参数来指示我想要返回的视频格式,或者可能在控制器上为每种格式创建单独的视图方法,等等。

啰嗦对你来说够了吗?:D我预计 Ruby 开发人员会有一些火焰,他们似乎对 MVC 的想法略有不同(尽管并非不兼容)。

0赞 staticsan 12/9/2008 #6

With MVC, people seem to be struggling with fitting four layers into three.

The MVC paradigm does not properly address the data storage. And that's the "fourth layer". The Model has the the processing; but since it also addresses the data, programmers put SQL in there, too. Wrong. Make a data abstraction layer which is the only place that should talk to back-end storage. MVC should be DMVC.

评论

1赞 staticsan 12/9/2008
Oh that's easy: the Models. Only the models. :-)