【发布时间】:2012-02-29 07:42:48
【问题描述】:
我正在构建一个当前有 3 个程序集的项目:
- 用户界面
- 核心(服务和模型、实用程序)
- 存储库 (Linq2SQL)
依赖是
- UI -> 核心
- 核心 -> 存储库。
我希望服务和模型位于它们自己的程序集中,并最终得到围绕模型构建的东西,即:
- UI ->模型、服务
- 服务 -> 模型、存储库
- 存储库 -> 模型
- 型号
我正在构建的系统基本上是一个网站 CMS,因此我将有一个网页模型 (PageModel),其中包含一组子网页。 PageModel 可以调用服务 (PageService) 中的方法来填充其子页面,但在新设计中这是不可能的,因为 Models 程序集必然对服务程序集一无所知。
我已经考虑了洋葱架构中的一些想法(即依赖注入)来解决这个问题,但似乎可以使用更优雅/更明显的解决方案。
需要再引入一层Model吗?查看模型?我认为我所说的模型是领域模型......我很可能错了!那么服务会是域服务吗?
所以我的解决方案是:
- UI -> 服务、视图模型、模型
- ViewModels -> 服务、模型
- 服务 -> 存储库、模型
- 存储库 -> 模型
- 型号
在这个例子中,我想我的 PageViewModel 会扩展 PageModel 并使用 PageService 来获取它的子页面..
任何建议表示赞赏。还有关于这些模型层通常被称为什么的任何指针?我在这里谈论的是 DTO 模型而不是域模型吗?域模型而不是视图模型?看来我提议使用视图模型的目的并不是真正的视图模型的工作..
谢谢
编辑:
我最初没有提到的一点是,我的领域模型不是您在大多数教程中看到的单个数据库实体的基本翻译。域模型可以包含来自多个相关数据库表的数据字段。
那么是否值得拥有一组模型来纯粹封装域中的数据 - 没有任何方法/属性来获取相关对象或将对象保存回数据库等? - 数据传输对象。
通过查看几个潦草的图表,这意味着在域层中有一组映射器(这似乎是错误的......)将 DTO 模型转换为域模型并返回。该项目将围绕 DTO 模型而不是域模型构建,但考虑到 DTO 封装的内容,我认为这不是问题。
对于任何感兴趣的人,建议的依赖结构如下所示:
- UI -> 服务、领域模型
- 服务 -> 存储库、域模型、DTO 模型
- 域模型 -> 存储库、DTO 模型
- 映射器 -> 领域模型、DTO 模型
- 存储库 -> DTO 模型
- DTO 模型(无依赖关系)
有点乱!而这一切只是因为我希望我的 PageModel 能够获取它自己的子 PageModels.. 看起来尝试依赖注入可能不是一个糟糕的计划。
感谢回复的人。你给了我很多思考。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-3