在使用MVC时,实体模型的命名规范是什么?

3
当我使用Entity Code First创建数据库时,如果我在asp.net中创建MVC 4项目,应该使用什么命名约定?我想要明确的是,实体模型不是MVC模型。例如,我应该有一个名为Project的类来定义EF将使用的属性,然后创建一个名为ProjectModel的MVC模型。我还将拥有ViewModels,这些ViewModels与表单中的模型略有不同,例如`ProjectDashboardViewModel`。在设置此类项目时,有哪些命名约定建议呢?

“MVC模型”是什么?在Model-View-Controller中,“M”代表应用程序域和业务逻辑。它包括您的数据库和表示实体的EF类。当您说“MVC模型”时,您指的是这个吗? - Robert Harvey
1
@RobertHarvey 我不会直接将我的EF模型传递给视图,因此它们在技术上与MVC使用的模型不同。我在我的项目实体中有三种类型的模型,即Entity(这些创建EF数据库内容),MVC Models(这仅是EF类的抽象),以及ViewModels(这实际上为视图提供所需的数据)。这不是正确的方法吗? - ios85
听起来你在提到仓库或服务层。提供“MVC模型”的额外间接层的目的是什么?EF已经通过其实体类提供了一层间接层。你的应用程序不能直接使用EF类,或通过一个薄的存储库层吗? - Robert Harvey
@RobertHarvey 嗯,我的理解是我不应该直接将实体模型传递给视图。我们的仓储层只包含创建 EF 所需的内容。但因为在一些视图模型中我们使用了两到三个作为对象传递的类,所以我们创建了这些其他类。 - ios85
4个回答

2

你已经在问题中表达了强烈的命名约定。我确实使用完全相同的命名约定 :)

  1. 领域模型不加前缀 - Project
  2. 对于不是真正视图模型的mvc类,使用Model后缀 - ProjectTableRowModel
  3. 视图模型使用ViewModel后缀 - ProjectDetailsViewModel

1
很不幸,这样的问题可能有很多答案,实际上并没有一个标准的规范,但以下是我的做法。
首先,我创建一个空的解决方案,称之为MyProject。然后,我向该解决方案添加一个类库,也叫做MyProject(我喜欢将域放在根命名空间中)。该类库将包含以下文件夹/命名空间:
MyProject
    Entities
        MyEntity1.cs
        MyEntity2.cs
    Database
        MyContext.cs

然后我将MVC项目添加到我的解决方案中,叫做 MyProject.Mvc。我在 MyProject.Mvc 中使用 ViewModelsDataTransferObjects 并使用 AutoMapper 使用我的实体构建它们。对于每个视图,我都有一个 ViewModel,如果我有一个名为 DashboardController 的控制器,并且具有名为 Overview 的操作,则我会专门为其创建一个 DashboardOverviewViewModel 对象。
将领域分离的一个好处是,在单元测试时变得更加容易,其中我会有相应的测试项目,称为 MyProject.TestsMyProject.Mvc.Tests这篇文章对于ViewModel处理提供了另一种非常有用的观点。

0

最佳实践是将映射到数据库表的实体放置在解决方案中的单独类库中。

您建议使用Project作为DB模型,使用ProjectModel作为MVC模型是合适的。

我认为您的ProjectModel实际上是一个ProjectViewModel,因为属性的选择和如何填充它们主要受到呈现要求的驱动。即使您可能没有Project View,也并不意味着您不能有Project ViewModel。也许您的ProjectDashboardViewModel包含许多ProjectViewModel对象。


0

这一切都关乎更好的可读性和可维护性。

你可以为ViewModel创建一个库,比如SomeProduct.ViewModel.dll,并在MVC Web项目中引用它。在该程序集中为类添加后缀"ViewModel",例如RevenueViewModel/RegisterViewModel。同时,在该项目中创建命名空间以按模块组织视图模型。

对于实体,你可以创建另一个库,比如SomeProduct.Entities.dll,并在MVC Web项目中引用该程序集。同样地,有效地使用命名空间来组织程序集内的对象。你可以为这些对象添加后缀"Model"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接