【问题标题】:Layer ASP.NET MVC Project层 ASP.NET MVC 项目
【发布时间】:2012-10-07 12:20:32
【问题描述】:

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

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

我现在的项目结构是这样的:

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

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

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

说这个项目是一个电子商务网站,我会这样组织它:

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

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

  • LayeredProject 中,我保留了我所有的 ViewModel 类、控制器和不同的 UI 逻辑。该项目引用了LayeredProject.Model 项目。

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

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

请帮助我理解这一点

【问题讨论】:

  • 我认为没有理由在模型项目中创建 EF 对象的克隆。您可以将逻辑添加到 EF 类。如果您希望这些对象保持干净,只需在代码中进行映射,而不是使用属性。
  • 好的,如果我可以将逻辑添加到 EF 类并直接使用它们,那么它们应该移入 Model 项目,对吗?另外,我认为 POCO 类应该是空的,没有继承的方法和接口,但我认为我错了。但是,EF 支持我的 POCO 的对象,但是如果我想切换到不同的 ADO,比如 Linq to Sql,那么我必须将 linq to sql 类映射到我的 POCO 的类,对吗?

标签: c# asp.net asp.net-mvc design-patterns domain-driven-design


【解决方案1】:

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

【讨论】:

  • 一般概念很好,但我需要更具体的东西。
【解决方案2】:

MVC 项目应包含:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 享受和慢慢来,我更喜欢阅读,但您也可以在asp.net/mvc/pluralsight观看一些免费视频
    • 我看到了 Pluralsight 的不错插件,这很好,因为 Pluralsight 很棒。
    【解决方案4】:

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

    这个项目展示了一种很好的简单方法,可以在 MVC 项目中的文件夹中将事物分开:RacoonBlog Project。虽然它使用 RavenDB 而不是 EF,但想法是一样的。

    【讨论】:

    • 是的,我计划将来在不同的环境中使用核心应用程序,例如平板电脑或桌面应用程序。我去看看项目,谢谢
    【解决方案5】:

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

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

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

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

    【讨论】:

    • 要将类保留在您使用 Code First 方法的模型中,并将 DataContext 保留在 DAL 中?或者您在 Model 和 DAL 项目中有相同的类?
    • 不确定代码优先方法是什么。我猜这意味着数据库尚不存在,而您开发模型并以此开发数据库?无论哪种方式,数据库的对象表示都保留在应用程序中。为了分离关注点,DAL 不应该关心这些类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2012-08-01
    • 2016-06-19
    • 2017-03-07
    相关资源
    最近更新 更多