分层ASP.NET MVC项目



我正在努力理解一个设计良好的项目的概念。

我正在使用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类的副本。

请帮助我理解这个

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

MVC项目应该包含:

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

这些是MVC的特定和关键部分,包括MVC中的VC(视图和控制器)。MVC中的M(模型)是可以"照常"完成的业务逻辑。也就是说,您不必在业务层中做任何特殊的事情就可以将其与MVC一起使用。您可以使用自己选择的技术(传统的DAL+BLL、WCF、WS或任何您想要的技术)。

这对于LOB应用程序来说非常有效。当然,如果你正在制作一个玩具应用程序,你可以忘记这一切,制作一些更简单的东西。但我只建议将其用于很少需要维护的应用程序。

以下是几个层中允许编辑"宠物"的对象的示例:

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

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

如果您使用"代码优先"方法构建数据访问,您可以深入阅读这篇内容丰富的文章并获得更多见解。

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

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

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

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

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

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

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

最新更新