C# 如何在MVC中实现n层架构?

C# 如何在MVC中实现n层架构?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我知道以前有人问过这个问题。我这样问只是为了得到更好的解释。在我的webforms应用程序中,我就是这样实现我的项目的。该解决方案有两个项目。第一个项目包含数据访问和业务逻辑。第一个项目在第二个项目中引用。aspx.cs文件调用业务逻辑类,业务逻辑类调用数据访问类 我正试图在我的MVC应用程序中遵循同样的方法。我将如何实现这一点?控制器调用模型,而模型又调用业务逻辑?这种方法会增加开销,对吗 关于评论的方向,这条线索(这不适合评论): 使用新MVC项目创建的models文件夹用于视图模型-它们是

我知道以前有人问过这个问题。我这样问只是为了得到更好的解释。在我的webforms应用程序中,我就是这样实现我的项目的。该解决方案有两个项目。第一个项目包含数据访问和业务逻辑。第一个项目在第二个项目中引用。aspx.cs文件调用业务逻辑类,业务逻辑类调用数据访问类


我正试图在我的MVC应用程序中遵循同样的方法。我将如何实现这一点?控制器调用模型,而模型又调用业务逻辑?这种方法会增加开销,对吗

关于评论的方向,这条线索(这不适合评论):

使用新MVC项目创建的models文件夹用于视图模型-它们是支持视图的类。这些不是您的业务模型或数据模型

例如,在支持视图的ViewModel中,您可能有一个呈现为下拉列表的enum属性:

public enum CustomerTypes 
{
    INDIVIDUAL = 0,
    COMPANY
}

public class CustomerViewModel
{
    public CustomerTypes Type { get; set; }

    public string[] CustomerTypesSelectList { get; set; }
}


public class CustomerController : Controller
{
    public ActionResult Edit()
    {
        var model = new CustomerViewModel();
        model.CustomerTypesSelectList = 
            Enum.GetNames(typeof(CustomerTypesSelectList));

        return View(model);
    }
}
这样,您的视图中就有了一些javascript,可以用
CustomerTypesSelectList
中的项目填充一个奇特的下拉列表

特定于用户界面的
string[]
属性是ViewModel的常见构造,当它转换为业务模型或数据模型时会被剥离。控制器将控制转换(也称为映射),但可能依赖另一个类来实现将ViewModel和业务模型联系在一起的映射

总之,在n层体系结构中:

  • MVC控制器不是您的业务逻辑。您的业务逻辑驻留在控制器调用的各种服务和组件中
  • Models文件夹包含ViewModels,这些类仅用于支持UI的操作
  • 在调用业务层时,控制器调用映射器在ViewModels和业务模型之间进行转换

  • 让您的体系结构具备以下功能

    数据访问项目-添加带有存储库和工作单元模式的ORM/ADO.net。可以使用来自ORM的T4模板生成存储库

    ViewModel项目-为Viewmodels创建单独的项目(包含视图要使用的属性)

    业务层-具有包含从数据访问层访问存储库的函数的类,如果需要,使用LINQ将它们连接起来,并填充到Viewmodel中,然后将视图模型对象或视图模型集合返回给控制器

    网络项目- 控制器-使用依赖项注入和返回视图模型来访问业务层函数
    视图-访问控制器返回的视图模式

    据我所知,在MVC中,控制器和视图模型是您的业务逻辑。模型是您的数据访问。视图是您的演示逻辑。@electrillama感谢您的回复。如果遵循这种方法,我会失去代码的可重用性吗?例如,我可以在Project3的示例中使用Project1,而无需再次复制Project1功能。我如何以一种不丧失可重用性的方式实现它?我不是权威,但对我来说有意义的方式是,ViewModel只能用于存储表示层所需的信息,并与强类型视图一起使用,以便于搭建。数据层模型应该只关注数据持久性所需的表示。在这两者之间是业务层,它有自己的模型来表示业务对象。。。这是2个项目还是3个项目取决于偏好。但这只是观点,不是科学。你应该检查我的问题是的,我已经实现了这个架构,你的控制器应该称为你的业务层,你的观点是基于你的业务对象的