委托设计模式在 Swagger 生成代码中的意义?
Significance of Delegate Design Pattern in Swagger Generated Code?
当我从 swagger yaml 为 Spring
生成代码时,通常使用 delegate
模式生成控制器层,这样对于单个模型会生成三个文件。例如,如果我在 swagger/open API yaml 文件中定义了一个名为 Person
的模型,则会生成三个文件:
- PersonApi (interface that contains signatures of all person operations/methods)
- PersonApiDelegate ( interface that provides default implementation of all PersonApi methods . Meant to be overriden )
- PersonApiController (Which has a reference to PersonApiDelegate so that any implementation can override and provide custom implementation)
我的问题是对于那些熟悉构建 swagger/openapi 生成代码的 apis 的人来说,拥有这样一个模式的意义是什么,而不仅仅是暴露你的使用 PersonController class 的服务端点,而不是通过 PersonApi 接口然后到 PersonApiDelegate,最后通过 PersonApiController 公开服务 ?
我们通过这种模式获得的有价值的设计可扩展性是什么?我试图从 Internet 上的其他资源中查找信息,但在 swagger first API 开发方法的背景下找不到好的答案。对此的任何见解都将非常有帮助。
首先澄清一下:正如评论中已经提到的,您不是被迫使用委托。相反,Spring 生成器的默认行为是不使用委托模式,因为您可以轻松地检查 docs。在这种情况下,它将仅生成 PersonApi 接口和 PersonApiController。
关于您的问题,为什么要使用委派?
这允许您编写一个 class 来实现 PersonApiDelegate,它可以很容易地注入到生成的代码中,而无需手动接触生成的源代码,并确保实现安全,以免将来可能发生的更改代码生成。
让我们想想如果没有授权会发生什么。
一种天真的方法是生成源代码,然后直接在生成的 PersonController 中编写实现。当然下次需要运行生成器,那就麻烦大了。所有的实现都会丢失...
稍微好一点但不完美的方案是编写一个扩展 PersonController 的 class。这将确保实现在生成期间不会被覆盖,但不会保护它免受生成引擎未来更改的影响:作为最低限度的实现 class 需要实现 PersonController 构造函数。现在,生成控制器的构造函数具有以下签名 PersonApiController(ObjectMapper objectMapper, HttpServletRequest request)
,但生成器的开发人员将来可能需要更改它。所以实现也需要改变。
第三种方法是完全忘记生成的 PersonApiController,只编写一个 class 实现 PersonApi 接口。那很好,但是每次生成代码时,您都需要删除 PersonApiController,否则 Spring 路由器会报错。还是手工作业...
但是有了委托,实现代码就完全安全了。无需手动删除内容,无需适应未来的变化。此外,实现 PersonApiDelegate 的 class 可以被视为独立服务,因此您可以根据需要向其中注入/自动装配。
当我从 swagger yaml 为 Spring
生成代码时,通常使用 delegate
模式生成控制器层,这样对于单个模型会生成三个文件。例如,如果我在 swagger/open API yaml 文件中定义了一个名为 Person
的模型,则会生成三个文件:
- PersonApi (interface that contains signatures of all person operations/methods)
- PersonApiDelegate ( interface that provides default implementation of all PersonApi methods . Meant to be overriden )
- PersonApiController (Which has a reference to PersonApiDelegate so that any implementation can override and provide custom implementation)
我的问题是对于那些熟悉构建 swagger/openapi 生成代码的 apis 的人来说,拥有这样一个模式的意义是什么,而不仅仅是暴露你的使用 PersonController class 的服务端点,而不是通过 PersonApi 接口然后到 PersonApiDelegate,最后通过 PersonApiController 公开服务 ?
我们通过这种模式获得的有价值的设计可扩展性是什么?我试图从 Internet 上的其他资源中查找信息,但在 swagger first API 开发方法的背景下找不到好的答案。对此的任何见解都将非常有帮助。
首先澄清一下:正如评论中已经提到的,您不是被迫使用委托。相反,Spring 生成器的默认行为是不使用委托模式,因为您可以轻松地检查 docs。在这种情况下,它将仅生成 PersonApi 接口和 PersonApiController。
关于您的问题,为什么要使用委派?
这允许您编写一个 class 来实现 PersonApiDelegate,它可以很容易地注入到生成的代码中,而无需手动接触生成的源代码,并确保实现安全,以免将来可能发生的更改代码生成。
让我们想想如果没有授权会发生什么。
一种天真的方法是生成源代码,然后直接在生成的 PersonController 中编写实现。当然下次需要运行生成器,那就麻烦大了。所有的实现都会丢失...
稍微好一点但不完美的方案是编写一个扩展 PersonController 的 class。这将确保实现在生成期间不会被覆盖,但不会保护它免受生成引擎未来更改的影响:作为最低限度的实现 class 需要实现 PersonController 构造函数。现在,生成控制器的构造函数具有以下签名 PersonApiController(ObjectMapper objectMapper, HttpServletRequest request)
,但生成器的开发人员将来可能需要更改它。所以实现也需要改变。
第三种方法是完全忘记生成的 PersonApiController,只编写一个 class 实现 PersonApi 接口。那很好,但是每次生成代码时,您都需要删除 PersonApiController,否则 Spring 路由器会报错。还是手工作业...
但是有了委托,实现代码就完全安全了。无需手动删除内容,无需适应未来的变化。此外,实现 PersonApiDelegate 的 class 可以被视为独立服务,因此您可以根据需要向其中注入/自动装配。