MVC模型设计/继承
原谅含糊的标题,我不确定该如何形容。
如果我们有通用模型"存档",如何根据用户选择的"类型"显示不同的视图/表单?
例如,用户创建一个新的" Archive",然后选择视频,书籍,音频等。从那里,他们根据档案类型获得不同的表格。
还是将它们拆分成不同的模型(视频,书籍,音频)会更好吗?
或者可以继承模型(例如Video扩展Archive)。我猜这是基本的OOP /类,但是不知道如何在这里应用它。
欢迎使用任何MVC框架中的示例!
解决方案
模型"视频","书本"和"音频"可以从"存档"继承。
每个模型都有一个控制器。
http:// yourserver / Books / Edit / 11
在创建相应的模型之前,我们必须让用户选择他们想要的档案类型。
编辑(回复评论)
在ASP.NET MVC中,模型将是一个类。
public class Video : Archive { public int Id {get;set} public string Name {get;set;} ... }
我们还将有一个控制器
public class VideoController : Controller { public object Edit(int id) { Video myVideo = GetVideo(id); return View("Edit", myVideo); } ... }
我们将在"视图"目录中拥有一个视图,例如,该页面包含
public class Edit : View<Video> { ... }
因此,如果我们使用的网址是
http:// localhost / Video / Edit / 11
这都是从内存中完成的,因此可能会出现一些错误,但要注意的是,我们要在模型上指定继承。该模型只是一个类。在情况下,我们想从存档继承。完成后,模型将像往常一样通过。
在我看来,支持MVC的一个要点是,如果所有用户需要的是不同的视图,则可能不需要自定义模型(或者仅需要模型的控制器)。仅当存储(持久性)体系结构指示需要它时,才会出现多个模型。如果需要多个模型,则诸如数据访问对象(DAO)之类的某些功能可能会在控制器和模型之间显示为另一层。
看一下Apache Struts项目的示例。如Struts for Newbies中所述,"要正确使用Struts,重要的是要掌握基本知识。首先,回顾一下关键技术入门,然后研究任何不熟悉的主题。"
有关其他资源,请参见Web层应用程序框架设计(Sun J2EE蓝图)
在任何MVC框架中,要真正显示不同的视图应该很容易。例如,在Microsoft ASP.NET MVC中,我们不仅会从如下所示的控制器返回视图:
return View();
但实际上会将视图的名称声明为参数:
return View("VideoArchive");
然后从Views / Archive / VideoArchive.aspx中显示视图
似乎我们不想让该类型从Archive继承。
"始终优先于封装/包含而不是继承"。
为什么不创建一个名为Archive的类并为其提供type属性。该类型可以使用继承来专门处理音频,视频等。
看来我们将基于其他一些条件来专门处理"存档"。 " FileSystemArchivce"," XMLArchive"," SQLArchive"和类型不会更改。但是我里面的敏捷主义者说,一开始可能没有必要,我们以后可以随时重构设计……
在控制器方面,我们可以通过封装视图中每种类型的表示差异来最大程度地发挥作用。因此,仅视图会根据类型进行更改。可能每种语言的语义和规则都相同,并且我们无需为每种类型使用单独的控制器。每种类型的视图将有所不同,因为它们将具有不同的属性。
单一责任原则(PDF)指出:
THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE.
存档类通过处理多种不同类型的存档而违反了此原则。例如,如果我们需要更新视频档案,则还需要修改处理书籍和音频档案的类。
处理此问题的适当方法是为每种不同类型的存档创建单独的类。这些类型应实现一个公共接口(或者继承一个公共基类),以便可以通过仅关注存档而不是特定存档类型的代码来将它们互换(多态)。
有了该类层次结构之后,我们只需要一个控制器即可查看每个模型类。
对于奖励积分,"单一责任原则"甚至可以证明使用工厂方法或者抽象工厂来创建模型,视图和控制器对象是合理的(而不是内联添加它们)。毕竟,创建对象和使用该对象是不同的职责,出于不同的原因,可能需要更改这些职责。