【问题标题】:How to return the DTO of a dependency service when my contracts are defined in an Interface layer?当我的合同在接口层中定义时,如何返回依赖服务的 DTO?
【发布时间】: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


【解决方案1】:

我会尽量表达我的想法。

  1. DTO 本身不必继承某些接口。接口有另一种语义。有时为某些 DTO 类创建基类很有用,但某些供应商(即 ServiceStack)不建议这样做。
  2. 我发现在您的项目中谈论 DTO 有点令人困惑。有 DTO 定义您的 WebApiUi 的合同。使用这种 DTO 只是将域模型转换为返回的 DTO 对象。根据 DDD,您的所有域服务和类都必须根据域模型进行描述。因此,域模型对服务合同 DTO 一无所知。所有转换都在 WebApiUi 控制器中执行。
  3. 另一种 DTO 是您从 DataAccessSrvs 获得的 DTO。我建议使用 DataAccessSrvs 来封装有关外部服务的知识,并将外部服务 DTO 转换为域模型。所以DataAccessSrvs的接口将按照域来描述。因此,此类层(BizDomain)的客户对外部服务合同一无所知。

考虑到这一点,我建议

1.

[WebApiUi] -> [DTOs], [BizDomain + Interfaces]

[BizDomain + Interfaces]

[DataAccessSrvs] -> [DTOs], [BizDomain + Interfaces]

在此模式中,[BizDomain] 类通过 [Interfaces](经典的依赖倒置)使用 [DataAccessSrvs],但 [BizDomain + Interfaces] 包含的接口仅用于域模型和 [DataAccessSrvs] 接口之间的某些“共享”,只是为了实现依赖倒置。 [BizDomain + Interfaces] 与某些服务合同和 DTO 无关。

2.

为了更好的可维护性,我建议将 WebApiUi 的 DTO 从 DataAccessSrvs 的 DTO 中分离出来:

[WebApiUi] -> [MyDTOs], [BizDomain + Interfaces]

[BizDomain + Interfaces]

[DataAccessSrvs] -> [ExternalDTOs], [BizDomain + Interfaces]

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 2019-07-03
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多