spring—当与多个服务交互时,有必要保留dto对象

cnjp1d6j  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(408)

我的问题的一点背景。我有一套以下服务:
适配器服务-用于从外部系统加载某些产品
apigateway-接受来自ui的请求。特别是,现在只有一个请求从产品服务接收产品数据以在ui中显示产品
产品服务-各种产品的数据存储服务。该服务本身并不明确知道它具体存储了什么样的产品。所有类型的产品都是由负责这些产品的其他服务动态创建的。产品数据存储为键值Map(从技术上讲,它是db列中的json字符串)
服务交互有一个模式
所以,蓝色地带的服务是我的(它们可以以任何方式改变)。红色区域描述另一个团队的服务(不能更改)。
有什么问题吗
要从外部系统加载产品,我想使用specialproductdto来存储产品数据。我可以使用一些验证特性,比如spring注解等等。然后要将产品从适配器服务加载到productservice,我必须将specialproductdto转换为map<string,object>,因为productserivcie需要它通过api。
当我通过apigateway获取ui的产品信息时,我需要调用productservice api来获取在map<string,object>中返回属性的产品,然后将这些数据转换为包含部分产品数据的uireponse(因为我不需要所有产品信息,只需要名称和价格)。
但是我也想在我的apigateway服务中使用specialproductdto,因为使用map<string,object>似乎容易出错。。。实际上,我需要从Map中盲目地获取数据来构建uiresponse。如果某些属性名将被更改怎么办?有了map,我只知道什么时候会从ui发出请求,但是使用特殊的dto,我在编译时会得到这样的异常。
问题
那么,最好的做法是什么с或者是拍拍т 我应该在这种情况下使用吗?目前我看到以下解决方案:
adapterservice和apigateway服务中都存在重复的DTO。因此,一个类中的任何更改都必须在另一个类中得到支持
使用map<string,object>的风险和风险由我自己承担,希望那里不会有任何改变
在apigateway和adapterserivce之间在一些单独的库和服务中共享特殊产品(似乎是反模式的,因为共享某些东西会产生很多问题)
с有人帮忙吗?

bgtovc5b

bgtovc5b1#

在我看来,复制DTO没有什么错。
另外,在一个单独的库中提供dto并没有错,它将在每个项目中导入,您将只共享productservice的合同,仅此而已。它不会在api网关和适配器之间造成任何紧密耦合。如果契约发生了变化,那么就必须在它的所有使用者(api网关和适配器)上进行更改,就这么简单。
关于使用 Map s:通常我不建议这样做,因为正如您所说,您将无法利用spring(和其他框架)提供的内置bean验证,但不仅如此,您还将根据情况使用大量强制转换和类型转换,这是不好的,可以通过使用DTO来阻止。
另外,请注意,在我看来,dto不应该用后缀“dto”命名。那是因为 SpecialProductDTO 没有明确说明此对象的使用位置或应该使用的位置。
相反,更喜欢 CreateSpecialProductRequest -这表示在创建特殊产品时使用此对象。另一个例子是 CreateSpecialProductResponse 它只是表示在创建特殊产品之后的响应(如果需要)。看看这个stackoverflow答案:java数据传输对象命名约定?

相关问题