solon icon indicating copy to clipboard operation
solon copied to clipboard

【欢迎讨论】关于 ActionExecuteHandler 和 Render 的命名(要不要改)讨论

Open noear opened this issue 7 months ago • 0 comments

最近有用户疑问 ActionExecuteHandler 和 RenderFactory 分别是干什么的?因为历史的原因,三言两语也讲不清。

但确实容易让人晕乎,不知所然。


1、ActionExecuteHandler(动作执行器接口,负责读取)

这个接口 “早期” 是输入 Context 和 Method 就输出执行结果。。。后来,体系内增加了“路由拦截器”对执行参数的二次确认,就改为:输出 Method 需要的参数。。。(原来是完整的执行,后来改为解析(或读取)出参数。。。意义上也大有变化)

介绍:

  • 功能:将 Context 的请求数据,转换为 Method 调用需要的参数
  • 类比:后来发现,它相当于 Spring HttpMessageConverter 的读部分(但不完全是)

区别:

  • HttpMessageConverter 只对 @RequestBody 的注解作处理
  • ActionExecuteHandler 对整个 Method 的参数做处理(比如把 json 分解到每个参数上)

2、Render(渲染接口,负接输出)

这个名字早期从 jFinal 借鉴来而,负责格式化输出。RenderFactory 是 Render 的创建工厂。“早期” 一些序列化框架的适配,在使用前需要固化配置,所以设计了 RenderFactory 去固化配置。。。(不断优化后,已经不需要提前固化配置了。但出于兼容考虑一直保留 RenderFactory)

介绍:

  • 功能:将模板渲染(或数据序列化)后写入 Context 的响应接口
  • 类比:相当于 Spring HttpMessageConverter 的写部分(但不完全是)

3、相比较于 HttpMessageConverter (的思考)

现在看来,两者合起来很像 HttpMessageConverter 的功能。。。最近有想过把它们合起来(会支持兼容过渡),比如叫 EntityConverter,或 ContextConverter (我们是多元处理,所以不能 Http 开头)

合起来后,“终端用户”在微调时,会更单一、更清晰(之前要管两个:ExecuteHandler 和 RenderFactory)。

  • 比如加个写的配置(或转换器),或读的配置(或转换器)

但 “终端用户” 要定制话,会变复杂。

  • 比如定制一个新的 JsonRender,几行代码就写完了(默认只需要实现一个接口)。
  • 如果定制 JsonEntityConverter,如果涉及读取转换,会复杂很多(当然是可以关闭的)。

讨论:

  • 现有名字要不要优化?改为什么名为好?
  • 要不要合并?如果合并,叫什么名为好?
  • 或者别的想法?

附:ActionExecuteHandler 和 Render 的需求:

  • 如果是模板,是没有解析参数的内容(合的话,可以关掉读的能力)。即需要 Render 能力
  • 如果表单数据,只会有解析参数的处理(合的话,可以关掉写的能力)。即只需要 ActionExecuteHandler 能力
  • 如果是格式数据,内部都会有序列化对象,提供序列化与反序列化的支持

noear avatar May 03 '25 23:05 noear