Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# MVC web项目的体系结构/不同类型模型的使用_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# MVC web项目的体系结构/不同类型模型的使用

C# MVC web项目的体系结构/不同类型模型的使用,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我正在构建一个目前有3个程序集的项目: 用户界面 核心(服务和模型、公用设施) 存储库(Linq2SQL) 依赖关系是 用户界面->核心 核心->存储库 我希望服务和模型在它们自己的组件中,并最终得到围绕模型构建的东西,即: 用户界面->模型、服务 服务->模型、存储库 存储库->模型 模型 我正在构建的系统基本上是一个网站CMS,因此我将有一个网页模型(PageModel),其中包含一组子网页。PageModel可以调用服务(PageService)中的方法来填充其子页面,但在新设

我正在构建一个目前有3个程序集的项目:

  • 用户界面
  • 核心(服务和模型、公用设施)
  • 存储库(Linq2SQL)
依赖关系是

  • 用户界面->核心
  • 核心->存储库
我希望服务和模型在它们自己的组件中,并最终得到围绕模型构建的东西,即:

  • 用户界面->模型、服务
  • 服务->模型、存储库
  • 存储库->模型
  • 模型
我正在构建的系统基本上是一个网站CMS,因此我将有一个网页模型(PageModel),其中包含一组子网页。PageModel可以调用服务(PageService)中的方法来填充其子页面,但在新设计中,这是不可能的,因为模型程序集必然不知道服务程序集的任何内容

我已经考虑过洋葱架构中的一些想法(即依赖注入)来解决这个问题,但似乎有一个更优雅/明显的解决方案

我需要引入另一层模型吗?查看模型?我想我所说的模型是领域模型。。。我很可能错了!那么服务将是域服务吗

因此,我的解决方案是:

  • UI->服务、视图模型、模型
  • 查看模型->服务、模型
  • 服务->存储库、模型
  • 存储库->模型
  • 模型
在本例中,我设想我的PageViewModel将扩展PageModel并使用PageService获取其子页面

如有任何建议,我们将不胜感激。还有关于这些模型层通常被称为什么的指针吗?我在这里谈论的是DTO模型而不是域模型吗?和域模型而不是视图模型?我提议使用视图模型的目的似乎不是视图模型的工作

谢谢

编辑:

我最初没有提到的一点是,我的域模型并不像您在大多数教程中看到的那样是单个数据库实体的基本翻译。域模型可以包含来自多个相关数据库表的数据字段

因此,是否值得拥有一组模型来封装域中的数据,而不使用任何方法/属性来获取相关对象或将对象保存回数据库等数据传输对象

从两个涂鸦的图表来看,这意味着在域层中有一组映射器(这似乎是错误的…)来将DTO模型转换为域模型并返回。该项目将围绕DTO模型而不是域模型构建,但考虑到DTO封装的内容,我不认为这是一个问题

对于任何感兴趣的人,建议的依赖结构如下:

  • UI->服务,域模型
  • 服务->存储库、域模型、DTO模型
  • 域模型->存储库,DTO模型
  • 映射器->域模型,DTO模型
  • 存储库->DTO模型
  • DTO模型(无依赖项)
有点乱!而这一切仅仅是因为我希望我的PageModel能够获取自己的子PageModels。。看起来,尝试依赖注入可能不是一个糟糕的计划


感谢那些回复的人。您给了我很多思考的空间。

使用洋葱架构,您可以很好地完成这一任务。 例如,我将有: 用户界面、域、数据访问、服务

用户界面 服务 数据存取 域(也包含视图模型)

用户界面可以访问任何一个。 服务,仅数据访问和域。 数据访问-仅限域

我的存储库接口位于域项目中,它们在数据访问项目中实现。 我还在域项目中保留其他接口(IContext、IUnitOfWork等),因此我有一个中心位置,并且不会在项目之间传播太多接口

如果您认为合适,DTO将仅用于层间传输。对我来说,没有理由不能从数据层向上传递域模型,有些人选择在这里只使用DTO。我将在UI层(ex MVC controller)中映射到ViewModel,因为我可以使用AoP为我完成映射([AutoMap()]属性)


请记住,您的模型不应该包含任何持久性逻辑。

我认为,与屏幕上显示的数据不同,存储数据是任何“现实世界”应用程序的典型特征。我认为你是在正确的轨道上,有两个独立的“模型”。我通常会打电话给他们:

  • ViewModels
    -映射到屏幕上显示的内容以及视图所需的内容
  • DataModels
    -映射到数据库,持久层(ORM)需要什么
有时,
数据模型
被称为
实体
,尤其是在将实体框架作为数据访问层或
数据传输对象
(DTO)时

通常也有一些“转换器”从视图映射到数据模型,或者有时可以使用AutoMapper

当然,如果您所显示的内容与数据结构足够接近,那么将所有持久性/数据模型传递给视图并没有坏处,但我也喜欢将它们分开

我已经考虑过洋葱架构中的一些想法(即依赖注入)来解决这个问题,但似乎有一个更优雅/明显的解决方案

一旦您掌握了正确使用依赖项注入的诀窍,它确实是一个非常优雅/显而易见的解决方案

我建议采用如下依赖结构:

  • 用户界面
    • 控制器->服务、模型、视图模型
    • 视图->视图模型
    • ViewModels(无依赖项)
  • 服务->存储库、模型
  • 寄存