MVC:模型应该继承BLL对象还是包含它?

时间:2011-01-10 12:38:42

标签: asp.net-mvc

有什么利弊:

  1. 使用BLL作为模型。
  2. 模型继承BLL。
  3. 型号包含BLL。
  4. 模型只包含将由视图使用的字段。
  5. 别的。
  6. 背景: 我有一些重型BLL课程,大约有100个字段。我将在一个视图中展示其中一些。相关模型应该如何看待。

4 个答案:

答案 0 :(得分:8)

没有专业人士,只有所有这些方法的利弊。最好的方法是4和5的组合。它被称为视图模型。因此,为每个视图创建一个视图模型,该视图仅包含此视图所需的字段,并在模型和视图模型之间进行映射。可以使用AutoMapper等工具来促进此映射。

答案 1 :(得分:3)

首先,让我们做一些明确的假设。

“ASP.NET MVC”基于经过验证的标准,称为"Model-View-Controller"架构模式。这不是一些微软极客的新发明;恰恰相反,自1979年以来,这种模式已被多个框架所采用。

那么,什么是“模特”?使用更现代的术语,它是域逻辑。它是您的业务实体,您的数据访问对象,甚至是您的一些静态声明的枚举和集合:您的应用程序使用的任何内容,具有业务价值,与某些特定的表示问题或要求无关。

这就是为什么我在内心深处说出你的问题没有多大意义。

在你试图解释你的问题之后,在jim和Darin Dimitrov回答之后,我猜你真正需要的是什么,你真正要问的是什么,变得更加清晰:你想知道的是如何< em>使用ASP.NET MVC应用程序的C和V绑定现有的MVC前业务层。

所以,如果你有一个设计良好的BLL层,更重要的是,如果你的BLL和DAL通过一些DTO进行通信,理论上你可以将它们直接绑定到你的视图。

如果这些DTO需要以某种方式进行转换(例如,因为最终用户无法直接理解它们),这应该通过使用一些“ViewModels”来完成,这些基本上是另一组特定于表示的DTO,以及服务器端数据验证的数据注释。当然,这种转变应该由您的控制员完成。

有些MS人会说你必须使用viewmodels,如果你不使用它们,你会腐烂到地狱。我不完全同意。当然,使用视图模型有几个优点(比如已经提到的数据注释,编译时验证,智能感知等等),但是如果没有它们,很多其他成功的MVC框架都没问题,我认为不应该与ASP.NET MVC不同。

那是我的2美分。

编辑使用视图模型的另一个重要优势与安全性有关:通过公开一组仅呈现的DTO,真正的域对象会受到一定程度的保护。

答案 2 :(得分:1)

Kamarey,

您可以安全地使用现有的BLL(如果它满足业务需求)。然后,您只需要在视图中标识要更新的谨慎部分,并为这些部分创建ViewModels。当然,您可能会发现在某些情况下,您可以将现有的BLL模型强烈地键入到视图中。即,例如,等。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IList<yourbll.model>>" %>

简而言之,我认为您需要分析与BLL相关的观点需求。

在ViewModel上查看这个SO问题的灵感:

ViewModel Best Practices

http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx

http://www.highoncoding.com/Articles/659_Implementing_ViewModel_in_ASP_NET_MVC_Application.aspx

答案 3 :(得分:1)

我认为最好的方法主要是3和4的组合,使用对于特定视图最简单的方法。

如果bll对象正是视图所需的,则可以直接使用它。虽然这并不是很多,因为你几乎总是需要别的东西 - 下拉值,名字而不是ids等。

如果数据对象非常靠近视图,我将它作为模型对象的属性。这样我的控制器就可以设置model.DataObject而不是单独复制属性。在编辑表单上,您需要注意您的视图包含所有数据对象属性的字段(如果存在敏感字段,显然不是一个好的选择),但它非常适合只读视图。

对于更复杂的视图或那些没有真正映射到单个数据对象的视图,请使用自定义模型对象并复制所需的属性,以便完全控制所包含的内容并保持视图代码的简单性。

我尝试过使用继承,但这真的只能让你获得所有其他方法的最差功能。

值得注意的是,如果需要,您可以非常轻松地切换到不同的模型 - 使用强类型视图,任何不匹配都很容易找到并修复。