Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 层ASP.NET MVC项目_C#_Asp.net_Asp.net Mvc_Design Patterns_Domain Driven Design - Fatal编程技术网

C# 层ASP.NET MVC项目

C# 层ASP.NET MVC项目,c#,asp.net,asp.net-mvc,design-patterns,domain-driven-design,C#,Asp.net,Asp.net Mvc,Design Patterns,Domain Driven Design,我试图理解一个设计良好的项目的概念 我正在使用ASP.NETMVC,我正在尝试创建一个分层(可插拔)项目 我现在拥有的当前项目结构是: LayeredProject-包含控制器的MVC项目 LayeredProject.EntityFramework-包含用于数据库的所有POCO类。(我使用代码优先的方法) LayeredProject.Model-这应该包含项目中使用的所有业务对象 如果说该项目是一个电子商务网站,我会将其结构如下: 在LayeredProject.EntityFramewo

我试图理解一个设计良好的项目的概念

我正在使用ASP.NETMVC,我正在尝试创建一个分层(可插拔)项目

我现在拥有的当前项目结构是:

  • LayeredProject
    -包含控制器的MVC项目

  • LayeredProject.EntityFramework
    -包含用于数据库的所有POCO类。(我使用代码优先的方法)

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

  • 如果说该项目是一个电子商务网站,我会将其结构如下:

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

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

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

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

    而且,如果这是正确的方法,那么我会有点困惑,因为我将在
    EntityFramework
    项目和
    Model
    项目中复制我的POCO类


    请帮助我理解这一点

    您可以使用分层结构以及MVC设计您的项目。控制器和视图部件应保持完好。您可以根据需要将业务逻辑部分划分为任意多个层。模型应根据您期望的层数而定。为此,将您的业务逻辑保留在一个单独的项目中(不是必需的:它可以存在于web项目本身中),将该项目中的DLL引用到MVC web解决方案中。将作为数据库查询结果生成的模型传递到web解决方案,并在controller的帮助下呈现视图。(我使用这种风格完成了我的项目)

    似乎您使用代码优先的方法来构建数据访问,您可以深入阅读这篇内容广泛的文章并获得更多的见解


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


    该项目展示了一种简单的方法,可以在MVC项目的文件夹中简单地将内容分开:。虽然它使用的是RavenDB而不是EF,但想法都是一样的。

    我开发的大多数MVC应用程序都是以这种方式分层的

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

    数据访问层(持久层):此项目使用ORM。(在您的案例中,实体框架)


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

    MVC项目应包含:

    • 视图模型:视图的模型,即非常特定于渲染每个视图的模型(这些模型不是MVC中的M)。此模型通常包含必须在视图中显示或编辑的数据,以及呈现视图所需的其他信息:例如,如果视图必须呈现下拉列表,则视图模型应包含相应的SelectList或IEnumerable以填充列表。您可以使用映射器(如AutoMapper或ValueInjector)将数据从业务实体(来自业务层的实体)移动到视图模型,反之亦然。或者,如果合适,您可以直接将业务实体用作模型视图中的属性(视图模型不需要是平面的:它可以包含对象作为属性)
    • 视图,使用视图模型强类型
    • 控制器:此控制器使用业务逻辑(即模型,MVC中的M)来控制应用程序流,为视图创建和提供模型视图,并对用户操作作出反应
    • UI助手:我通常添加此层以满足干燥原则。也就是说,如果我必须准备一个SelectList,并且它将在许多视图中使用,我会在这一层中使用它,并在所有必要的地方使用它。这可能包括计算、排序或任何与UI相关的内容,因此它不适合业务层(模型)。这将使用业务层,并为视图提供特定的数据
    这些是MVC的具体和关键部分,包括MVC中的VC(视图和控制器),MVC中的M(模型)是可以“照常”完成的业务逻辑。也就是说,您不必在业务层做任何特殊的事情,就可以将其与MVC结合使用。您可以使用您选择的技术(传统的DAL+BLL、WCF、WS或任何您想要的技术)

    这对于LOB应用程序来说非常有效。当然,如果你正在制作一个玩具应用程序,你可以把这一切都忘掉,让它变得更加单一。但我只建议对很少需要维护的应用程序使用这种方法

    以下是允许编辑“宠物”的多个图层中的对象示例:

    • 业务逻辑层:
      • PetService,一个可用于读取、写入、查找和修改pets的类(如上所述,无论如何