【问题标题】:How to setup architecture for mvc project如何为 mvc 项目设置架构
【发布时间】:2011-09-17 13:09:55
【问题描述】:

我正在尝试使用 MVC。我来自 ASP.Net 背景。

创建新的 mvc 3 应用程序后,我在同一个 webapp 项目下获得了控制器、模型和视图。在 ASP.Net 中,我们通常为模型和控制器创建单独的项目(我假设它们与业务层相同)。我还为 DAL 创建了一个单独的项目,我将在其中使用 EF。

我很困惑,这是理想的解决方案结构吗?我们不应该为每一层创建单独的项目吗?由于我将 DAL 作为一个单独的项目创建,因此我必须在其中添加 WebApp 的引用,因为我想从 DAL 返回模型,因此现在我无法将 DAL 的引用添加到我的 WebApp。

有人可以说明我在这里缺少什么吗?我做的不对吗?

【问题讨论】:

标签: c# asp.net-mvc architecture


【解决方案1】:

MVC 确实将“M”部分留给了开发人员。

即使在他们的官方示例中,您也会看到变化。您的问题暴露了对 MVC 最常见的误解之一。你不应该将你的域或数据模型直接绑定到视图,你的控制器方法也不应该接受它们作为参数。见this post on over and under-posting

理想情况下,您的控制器将调用 DAL,并且某些机制会将这些数据或域模型映射到视图模型。 WebApp“Models”文件夹中应该存在的正是那些 View 模型(专门用于促进 UI 的模型)。

因此,您创建一个包含 DAL 的新程序集肯定是在正确的轨道上。映射到 ViewModel 的“最简单”机制之一是每个 ViewModel 上的简单方法:

public class MyWidgetFormModel()
{
   public string Name { get; set; }
   public string Price { get; set; }

   public MapFromDAL(DAL.Widget widget)
   {
      this.Name = widget.Name;
      this.Price = widget.Price;
   }
}

更新:根据您的 cmets,here is an excellent answer 关于一位用户的项目布局。

【讨论】:

  • 那么如果有模型类可以在 UI 中使用,DAL 应该驻留在单独的项目中?创建 mvc 应用时自带的默认结构可以分解吗?
  • 对于模型来说,移动结构是安全的,但视图应该保持在同一个位置,控制器不需要去任何地方。
  • 在您给出的示例中,如果我的模型类与我的 UI 在同一个项目中,那么我将添加对 UI 的 DAL 引用。我不想那样做。我希望我的控制器管理 DAL 操作,并且我希望映射发生在 DAL 中。此外,如果我将控制器保留在同一个项目中,我最终会添加对 UI 的 DAL 引用。是不是错了,还是我做的不对?
  • 我明白了。正是我不想做的。我需要在这方面做更多的工作才能理解。仍然不完全相信我为什么要让我的 DL 知道我的 UI 在哪里。仅仅因为我希望控制器调用 DL 并且我不能将控制器从 UI 项目中取出?
  • 优秀的链接。这会有很大帮助。
【解决方案2】:

当我开始使用 MVC 时,我遵循了 Jeffrey Palermo 洋葱架构。你可以阅读它:

这里:http://jeffreypalermo.com/blog/the-onion-architecture-part-1/

这里:http://jeffreypalermo.com/blog/the-onion-architecture-part-2/

这里:http://jeffreypalermo.com/blog/the-onion-architecture-part-3/

它使用 IoC 支持来解耦服务。我认为您应该考虑使用 IoC 容器,因为 MVC 架构是围绕使用 IoC 的模式来考虑的,以便解耦服务(层)。

您还可以使用洋葱架构从http://codecampserver.codeplex.com/ 下载工作示例。

它不是您可以与 MVC 一起使用的唯一架构,但它是一个很好的起点,可以帮助您了解 IoC 和 MVC 应用程序中的解耦。

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 2023-04-04
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多