2

我试图理解一个好的设计项目的概念。

我正在使用 ASP.NET MVC,并且正在尝试创建一个分层(可插入)项目。

我现在拥有的当前项目结构是这样的:

  1. LayeredProject- 包含控制器的 MVC 项目

  2. LayeredProject.EntityFramework- 包含用于数据库的所有 POCO 类。(我正在使用代码优先方法)

  3. LayeredProject.Model- 这应该包含项目中使用的所有业务对象。

说该项目是一个电子商务网站,我会这样构建它:

  • LayeredProject.EntityFramework项目中,我有对应于数据库表的类。类别、产品、用户。该项目仅用于保存和加载数据库中的数据,这些对象不应用于其他目的。这个项目有一个对LayeredProject.Model项目的引用。

  • LayeredProject.Model项目中,我存储了我使用的所有对象,其中大多数都是LayeredProject.EntityFrameworkPOCO 的对象和使用的其他一些服务类的副本。

  • LayeredProject保留了我所有的 ViewModels 类、控制器和不同的 UI 逻辑。这个项目有一个对LayeredProject.Model项目的引用。

首先,我不确定这是否是正确的做法。

而且,这是正确的做法,然后我会有点困惑,因为我将在EntityFramework项目和Model项目中复制我的 POCO 类。

请帮助我理解这一点

4

5 回答 5

1

您可以使用分层结构设计您的项目,也可以使用 MVC。控制器和视图部分应保持不变。您可以根据需要将业务逻辑部分划分为任意多的层。该模型应该是您期望的层数的结果。为此,将您的业务逻辑保留在一个单独的项目中(不是必需的:它可以在 Web 项目本身中),将该项目中的 dll 引用到 MVC Web 解决方案。将由于数据库查询而生成的模型传递给 Web 解决方案,并在控制器的帮助下呈现视图。(我已经使用这种风格完成了我的项目)

于 2012-10-07T12:41:11.780 回答
1

MVC 项目应包含:

  • 视图模型:视图模型,即非常特定于渲染每个视图的模型(这些模型不是 MVC 中的 M)。该模型通常包含必须在视图中显示或编辑的数据,以及渲染视图所需的附加信息:例如,如果视图必须渲染下拉列表,则视图模型应包含相应的 SelectList 或 IEnumerable 以填充列表。您可以使用映射器,如 AutoMapper 或 ValueInjecter 将数据从业务实体(来自业务层的实体)移动到视图模型,反之亦然。或者如果合适,您可以直接将业务实体用作模型视图中的属性(视图模型不需要是平面的:它可以包含对象作为属性)
  • 视图,使用视图模型进行强类型化
  • 控制器:此控制器使用业务逻辑(即模型,MVC 中的 M)来控制应用程序流程,为视图创建和提供模型视图,并对用户操作做出反应
  • UI helper:我通常添加这一层来实现 DRY 原则。即,如果我必须准备一个 SelectList 并且它将在许多视图中使用,我会在这一层中进行,并从所有必要的地方使用它。这可能包括计算、排序或与 UI 密切相关的任何内容,因此它不适合业务层(模型)。这使用业务层,并提供特定于视图的数据。

这些是 MVC 的特定和关键部分,其中包括 MVC 中的 VC(视图和控制器) MVC(模型)中的 M 是可以“照常”完成的业务逻辑。即你不需要在你的业务层做任何特别的事情来使用它和MVC。您可以使用您选择的技术(传统的 DAL + BLL、WCF、WS 或任何您想要的)。

这对于 LOB 应用程序很有效。当然,如果你正在做一个玩具应用程序,你可以忘记这一切,做一些更单一的东西。但我只建议很少有维护需求的应用程序这样做。

这些是允许编辑“宠物”的多个图层中的对象示例:

  • 业务逻辑层:
    • PetService,一个可用于读取、写入、查找和修改宠物的类(如上所述,如何实现并不重要)
  • 业务实体:是管理宠物的BLL实体。这可以是 POCO 对象或 DDD 实体:
    • Pet - int Id、int PetTypeId、字符串名称...
  • View Model:包含一个 Pet 属性,以及一个 PetType 列表,以便视图可以呈现 PetTypeId 的下拉列表:
    • PetViewModel - 宠物 ThePet,选择列表 PetTypes
  • UI Helper:如果 PetTypes 将用于一个或两个以上的视图,PetUiHelper 可以为所有需要它的视图提供这个选择列表:
    • PetUiHelper - GetPetTypesList()
  • Pet 视图:PetViewModel 的强类型视图
    • 视图\宠物\Edit.cshtml
  • PetController:使用 PetService 创建视图及其模型视图。
    • PetController - Edit(int id) --> 返回一个 Edit 视图及其对应的 PetViewModel。还必须有一个 HttpPost Edit 操作,它接收特定模型或 PetViewModel 中的用户输入,或 Pet 加上 Id 或其他任何内容。这取决于您正在编辑的内容。

最后,如果您知道如何使用 DI,您可以使用 Unity.Mvc 或任何其他选项在控制器中注入业务服务。

于 2013-06-11T10:07:47.997 回答
0

似乎您使用 Code First 方法来构建数据访问,您可以深入了解这篇广泛的文章并获得更多见解。

http://ofps.oreilly.com/titles/9781449320317/ch_AdvancedData.html

于 2012-10-07T12:45:53.660 回答
0

你可能有太多的层,没有理由将模型与业务逻辑与 LayeredProject MVC 层本身分开,除非你计划有一个客户端应用程序或其他一些单独的项目来访问模型。在 MVC 项目中,您已经有一个模型文件夹可以用于此目的。然而,在 MVC 项目中,您还应该添加一个“ViewModels”文件夹来保存专门用于视图关注点的模型(例如 DTO 对象)。

这个项目展示了一种很好的简单方法,可以在 MVC 项目的文件夹中简单地保持事物分开:RacoonBlog Project。尽管它使用 RavenDB 而不是 EF,但想法是相同的。

于 2012-10-07T12:57:30.357 回答
0

我工作过的大多数 MVC 应用程序都是以这种方式分层的

MVC 项目:拥有控制器、视图和模型。业务逻辑驻留在模型中。

数据访问层(持久层):该项目使用 ORM。(在你的情况下实体框架工作)

映射到数据库表的类驻留在模型中,而不是数据访问层中。

于 2012-10-08T18:29:22.853 回答