我决定对我制作的所有新网站大力推进MVC。我对您是否可以在模型级别进行任何处理有疑问。
提出这个问题的案例是一个视频网站。我有一个Video类(模型)和用户观看视频时需要做的事情之一我需要在数据库中记录视图。我不确定是否需要在控制器中添加查询,或者我是否可以在Video类中添加addView方法。
对我来说,基本的基本问题是我在模型中限制使用哪种方法?可以是任何东西,还是只需要访问器(a.k.a getValue / setValue)?
答案 0 :(得分:5)
Ruby on Rails有座右铭skinny controller, fat model。这不仅适用于Rails,应该适用于任何mvc框架。
答案 1 :(得分:2)
我认为你的模型正是处理这个问题的地方。现在,您的模型必须仅由您的实体类组成。在我看来,您的模型将包括您的实体以及您需要实现的任何业务逻辑。您的控制器应该只处理视图的I / O,调用模型方法来完成用户通过用户界面调用的操作(视图)。
答案 2 :(得分:1)
我将如何做到这一点。它应该在几乎任何语言中都有效。
View会启动对控制器的OnView()方法的方法调用,然后显示控制器向其吐出的任何内容(当然是以受控的方式...我认为你的视图将包含一个视频播放器组件,所以你将从控制器中获得某种类型的视频)
在你的控制器中,有一个方法OnView()可以做3件事:实例化Video对象(即使用你的数据层来获取模型对象),调用Video对象上的updateViewCount()方法,并显示视频(通过将Video对象返回到View,大概是)。
视频模型对象包含代表您的视频和您需要的任何houskeeping内容的数据,其中包括updateViewCount()。这样做的理由是Video 具有视图计数(聚合)。如果“视图计数”需要是一个复杂的对象而不是一个整数,那么就这样吧。从磁盘上的原始表示形式创建Video对象的数据层(数据库?)也将负责在视频创建过程中加载和创建相应的视图计数对象。
所以,这是我的0.02美元。你可以看到我创建了第四个东西(前三个是模型,视图和控制器),它是数据层。我不喜欢模型对象加载和保存自己,因为他们必须知道你的数据库。我不喜欢控制器直接进行加载和保存,因为它会导致控制器之间出现重复的代码。因此,一个单独的数据层只能由控制器直接访问。
最后请注意,这是我查看视图的方式:用户所做的一切以及用户看到的所有内容都应该通过视图。如果屏幕上有一个显示“播放”的按钮,它不应该直接调用控制器方法(在许多语言中,没有这样做的危险,但有些,如PHP,可能会允许这样做)。现在,视图的“播放”方法将转向并在控制器上调用适当的方法(在示例中为OnView),并且不执行任何其他操作,但该层在概念上很重要,即使它在功能上无关紧要。同样,在大多数情况下,我希望您的视图播放视频流,因此控制器返回到视图的数据将是视图所需格式的流,这可能不一定是您的确切模型对象(并添加即使您可以直接使用Video对象,也可以建议额外的去耦层。这意味着我可能实际上使我的OnView方法获取一个参数,指示我想要返回的视频格式,或者可能在控制器上为每种格式创建单独的视图方法等。
啰嗦得足以呀? :D我预计会有一些来自Ruby开发人员的火焰,他们似乎对MVC有一点不同(虽然并不是不兼容)的想法。
答案 3 :(得分:0)
由于你可以使用你想要的任何模型代码与MVC(不仅限于LINQ),简短的答案是肯定的。在模型中应该做什么也许是一个更好的问题。根据我的喜好,我会添加一个ViewCount属性(它可能映射到Video表中的一列,除非你跟踪每个用户,在这种情况下它将在UserVideo表中)。然后从控制器中增加此属性的值。
答案 4 :(得分:0)
对于MVC,人们似乎正在努力将四层融合为三层。
MVC范例不正确地处理数据存储。这就是“第四层”。模型有处理;但由于它也处理数据,程序员也将SQL放在那里。错误。创建一个数据抽象层,这是唯一应该与后端存储通信的地方。 MVC应该是DMVC。
答案 5 :(得分:-1)
请记住,MVC有很多变化,没有真正的“正确方法”来做事。最终,您如何设计课程取决于个人偏好。但是,既然你要求设计建议,这是我的两分钱:
业务逻辑属于控制器。将其保留在模型和视图之外。
在MVC模式的众多变体中,passive view样式似乎是最容易测试的。在被动视图中,您的类设计如下:
您的控制器是“智能的:它会对数据库进行更改,更新模型,并使视图与模型同步。除了对模型和视图的引用之外,控制器应保存尽可能少的有状态信息。可能的。
该模型是“愚蠢的”,这意味着它只保存视图的状态而没有其他业务逻辑。模型不应该包含对视图或控制器的引用。
视图是“愚蠢的”,这意味着它只将信息从模型复制到UI,并调用由控制器处理的事件处理程序。视图不应包含其他业务逻辑。视图不应该包含对控制器或模型的引用。
如果您是MVC纯粹主义者,那么模型更新自身或数据库是没有意义的,因为这些职责属于控制器,所以不适合创建addView方法到您的Video类。