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