当我的合约在接口层中定义时,如何返回依赖服务的DTO

本文关键字:返回 何返回 依赖 DTO 服务 我的 接口 定义 | 更新日期: 2023-09-27 18:19:54

我正在使用域驱动设计方法,在C#.NET 4.5 web API解决方案中构建我的RESTful web服务,其中包含以下项目:

  • WebApiUi(控制器等)

  • BizApi(内容服务等)

  • BizDomain(业务逻辑等)

  • DataAccessDB(数据库存储库、DAL等)

  • DataAccessSrvs(依赖web服务DALs等)

  • 接口(DTO、类接口等)

该解决方案中的引用通常在列表中列出,因此每个项目都引用Interfaces项目,而WebApiUi则引用BizX项目,BizX又引用DataAccessX项目。

DataAccessSrvs项目中的web服务访问返回的DTO不继承interfaces项目中定义的接口。这意味着我无法轻松地将它们传递回BisX层或在WebApiUi层中使用它们。

这里的最佳做法是什么?我应该在接口层中完全定义的DTO中打开它们并重新打包它们的数据吗?

web服务是使用.NET生成的客户端代码使用的。

当我的合约在接口层中定义时,如何返回依赖服务的DTO

我会努力表达我的想法。

  1. DTO本身不必继承某些接口。接口还有另一种语义。有时,为某些DTO类创建基类是有用的,但一些供应商(如ServiceStack)不建议这样做
  2. 我看到在你的项目中谈论DTO有点令人困惑。有DTO正在卸载您的WebApiUi的合同。使用这种DTO只是将域模型转换为返回的DTO对象。根据DDD,您的所有域服务和类都必须根据域模型进行描述。因此,域模型对服务契约DTO一无所知。所有转换都在WebApiUi控制器中执行
  3. 另一种DTO是从DataAccessSrvs获得的。我建议使用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的DTOs与DataAccessSrvs的DTOs:分开

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