如何为MVC项目设置架构

6

我正在尝试学习MVC。我的背景是ASP.Net。

创建了新的MVC 3应用程序后,我在同一WebApp项目下得到了控制器、模型和视图。在ASP.Net中,我们通常为模型和控制器(我认为它们与业务层相同)创建单独的项目。此外,我还创建了一个单独的数据访问层(DAL)项目,其中我将使用EF。

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

请问有人能够帮助我澄清一下吗?我做错了什么吗?


2
https://dev59.com/FEzSa4cB1Zd3GeqPjRXN - mrydengren
谢谢提供链接。我创建了一个像里面所解释的示例项目,让我有了清晰的想法。非常感谢。 - Asdfg
2个回答

6
MVC真正将"M"部分交给开发者处理。即使在官方示例中,也会看到各种不同的变体。你的问题暴露了关于MVC最常见的误解之一。您不应直接将领域或数据模型绑定到视图,您的控制器方法也不应该接受它们作为参数。请参见此帖子关于过度和欠度发送。理想情况下,您的控制器将调用DAL,某些机制将这些数据或领域模型映射到视图模型。就是那些专门存在以促进UI的视图模型,应该存在于WebApp "Models"文件夹中。因此,创建一个新的程序集来包含您的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;
   }
}
更新: 根据您的评论,这里有一个关于一位用户项目布局的优秀答案

那么,如果有可能在UI和DAL中使用的模型类,应该放在单独的项目中吗?打破创建MVC应用程序时默认结构是否可以? - Asdfg
对于模型来说,移动结构是安全的,但视图应该保持在原位,控制器不需要移动到其他地方。 - Peter J
在你提供的例子中,如果我的模型类与我的用户界面在同一项目中,那么我将会向 UI 添加 DAL 引用。但我不想这样做。我希望我的控制器来管理 DAL 操作,并且我希望映射发生在 DAL 中。此外,如果我把控制器放在同一项目中,最终会向 UI 添加 DAL 引用。这难道不是错误的吗,或者是我理解有误? - Asdfg
我明白了,这正是我不想做的。我需要再多花点时间来理解这个问题。我仍然不完全相信为什么我应该让我的数据层知道我的用户界面在哪里。只是因为我希望控制器调用数据层,而我不能将控制器从用户界面项目中移除吗? - Asdfg
非常好的链接。那会帮助很多。 - Asdfg

3
当我开始使用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中可以使用的唯一架构,但它是一个非常好的起点,可以学习MVC应用程序中的IoC和解耦。

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