【发布时间】:2014-08-28 11:29:37
【问题描述】:
我正在使用领域驱动设计方法在 C# .NET 4.5 Web API 解决方案中构建我的 RESTful Web 服务,其中包含以下项目:
WebApiUi(控制器等)
BizApi(内容服务等)
BizDomain(业务逻辑等)
DataAccessDB(数据库存储库、DAL 等)
DataAccessSrvs(依赖 Web 服务 DAL 等)
接口(DTO、类接口等)
此解决方案中的引用通常按该列表进行,因此每个项目都引用 Interfaces 项目,而 WebApiUi 引用 BizX 项目,而 BizX 项目又引用 DataAccessX 项目。
DataAccessSrvs 项目中的 Web 服务访问返回的 DTO 不继承 Interfaces 项目中定义的接口。这意味着我不能轻易地将它们传递回 BisX 层或在 WebApiUi 层中使用它们。
这里的最佳做法是什么?我应该在接口层中完全定义的 DTO 中解开它们并重新打包它们的数据吗?
使用 .NET 生成的客户端代码使用 Web 服务。
【问题讨论】:
-
什么是“DDD 模式”,这与 DDD 有什么关系?
-
领域驱动设计。使用单词模式可能是不明智的。编辑反映。
-
“DTO [...] 不继承 Interfaces 项目中定义的接口。” -- DTO 通常不实现接口,它是一个没有行为的简单数据容器。此外,您选择引入一个额外的
DataAccessSrvs层,该层返回刚从数据库中取出的对象。我猜想这些对象和领域层对象之间会发生转换。这可能有点矫枉过正,我看不出为什么这些对象应该与 BizX 和 UI 层之间交换的 DTO 相同。 -
DTO 和 C# 接口恰好包含在一个项目中。 DTO 不继承任何接口。 DataAccessSrvs 项目用于调用作为此解决方案依赖项的 Web 服务,而 DataAccessDB 项目用于直接访问数据库。
-
好的,我以为
DataAccessSrvs也与数据库通信。我不确定您最终真正要问的是什么,但我倾向于使用存储库将外部 Web 服务内容转换为您的域实体。存储库接口通常在域层中定义,具体的存储库实现在基础设施层中(DataAccessSrvs?)。基础设施引用域,因此没有依赖问题。
标签: c# .net rest domain-driven-design