2008-09-24 144 views
1

原谅模糊的标题,我不确定如何描述它。MVC模型设计/继承

如果您有一个通用模型“归档”,您将如何基于用户选择的“类型”显示不同的视图/表单?

例如,用户创建一个新的“存档”,然后获取视频,书籍,音频等的选择。从那里他们根据存档类型获得不同的表单。

或者将它们分成不同的模型比较好 - 视频,书籍,音频?

或者模型可以继承(比如Video extends Archive)。我想这是基本的OOP /类,但不知道如何在这里应用。

欢迎来自任何MVC框架的示例!

回答

3

好像你不希望有从存档类型继承。 “始终支持继承的封装/遏制”。

为什么不创建一个名为存档类,并给它一个类型属性。类型可以使用继承专门为音频,视频等

这似乎是你会基于一些其他标准专门档案。 “FileSystemArchivce”,“XMLArchive”,“SQLArchive”和类型不会更改。但我的敏捷人士说,这可能一开始并不需要,你可以随时重构设计......

就控制器而言,你可能通过封装差异来获得最大的回报视图中的每种类型的演示文稿。所以只有视图根据类型而改变。可能每个人的语义和规则都是一样的,你不需要为每种类型分别设置控制器。对于每种类型,视图都会有所不同,因为它们具有不同的属性。

3

您的模型视频,图书和音频可以继承存档。

而且每个模型都会有一个控制器。

http://yourserver/Books/Edit/11

你必须让你的用户,您创建相应的模型前挑选他们想要的档案类型。

EDIT(在响应评论)

在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

这一切都是从内存完成的,所以可能会出现一些错误,但回家的信息是您在模型中指定了继承。该模型只是一个类。在你的情况下,你想从存档继承。一旦你完成了这个模型就像平常一样传递。

+0

谢谢。你可以举一个如何指定模型继承的例子吗? – meleyal 2008-09-24 19:27:20

0

在我看来,一个支持MVC的实质就是如果所有用户需要的是不同的视图,您可能不需要自定义模型(或控制器 - 其中只有一个控制器)。只有存储(持久性)体系结构需要它时,才会出现多个模型。如果您需要多个模型,某些功能(如数据访问对象(DAO))可能会显示为控制器和模型之间的另一个层。

查看Apache Struts项目的示例。正如Struts for Newbies所述,“要充分使用Struts,重要的是要对基础知识有一个很好的把握。首先检查Key Technologies primer,并研究任何不熟悉的主题。“

对于其他资源,请参阅Web-Tier Application Framework Design(孙J2EE蓝图)

3

要真正表现出了不同的看法应该很容易在任何MVC框架。例如,在微软ASP.NET MVC,你不会只返回一个视图从类似下面的控制器:

return View(); 

但实际上会陈述视图作为参数的名称:

return View("VideoArchive"); 

这将然后显示从查看视图/存档/ VideoArchive.aspx

0

Single Responsibility Principle(PDF)指出:

永远不应该有一个以上的理由采用类来更改。

您的存档类违反了这个原则,通过处理多种不同类型的存档。例如,如果您需要更新视频存档,您还正在修改处理书籍和音频存档的类。

适当的方式来处理,这是为每个不同类型的归档文件的创建单独的类。这些类型应该实现一个通用接口(或继承一个公共基类),以便可以通过代码来交换(多态)处理它们,这些代码只关心归档,而不是特定的归档类型。

一旦你在地方类层次结构,你只需要为每个模型类单个控制器和视图。

奖励积分的单一职责原则,甚至可以证明使用工厂方法或抽象工厂用于创建模型,视图和控制器对象(而不是新-ING起来内嵌)。毕竟,创建对象并使用该对象是不同的责任,可能需要根据不同的原因进行更改。