C# 如何设置mvc项目的体系结构

C# 如何设置mvc项目的体系结构,c#,asp.net-mvc,architecture,C#,Asp.net Mvc,Architecture,我正在尝试获得MVC。我来自ASP.Net背景 在创建了新的MVC3应用程序之后,我在同一个webapp项目下获得了控制器、模型和视图。在ASP.Net中,我们通常为模型和控制器创建单独的项目(我假设它们与业务层相同)。我还为DAL创建了一个单独的项目,我将在其中使用EF 我很困惑,因为这是理想的解决方案结构吗?我们是否应该为每个层创建单独的项目?由于我将DAL作为一个单独的项目创建,我必须在其中添加一个对WebApp的引用,因为我想从DAL返回模型,因此现在我无法将DAL的引用添加到我的Web

我正在尝试获得MVC。我来自ASP.Net背景

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

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

有人能帮我解释一下我到底错过了什么吗?我做得不对吗?

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

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

理想情况下,您的控制器将调用DAL,一些机制将这些数据或域模型映射到视图模型。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;
   }
}

更新:根据您的评论,关于一个用户的项目布局。

当我开始使用MVC时,我遵循了Jeffrey Palermo onion架构。您可以阅读以下内容:

在这里:

在这里:

在这里:

它使用IoC对分离服务的支持。我认为您应该考虑使用IOC容器,因为MVC体系结构是围绕IOC模式来考虑的,以便解耦服务(层)。 您还可以使用onion体系结构加载工作示例


这不是MVC可以使用的唯一体系结构,但它是一个非常好的起点,可以学习MVC应用程序中的IoC和解耦。

那么,如果有模型类可以在UI中使用,DAL应该位于单独的项目中?在创建mvc应用程序时,可以分解默认结构吗?对于模型,可以安全地移动结构,但视图应该保持在同一位置,控制器不需要移动到任何地方。在您给出的示例中,如果我的模型类与我的UI位于同一项目中,然后我将向UI添加DAL引用。我不想那样做。我希望我的控制器管理DAL操作,我希望映射在DAL中发生。另外,如果我将控制器保持在同一个项目中,我最终会向UI添加DAL引用。我明白了,是不是错了,还是我做得不对。正是我不想做的。我需要在这方面做更多的工作来理解。仍然不完全相信为什么我应该让DL知道我的UI在哪里。仅仅因为我希望控制器调用DL,而我不能将控制器从UI项目中取出?非常好的链接。这会有很大帮助。谢谢你的链接。创建了一个示例项目,就像在那里解释的一样,它给了我清晰的想法。非常感谢你。