我现在正在使用 ATG 9.X,我相信PipelineManager
它自己不会将参数转换为任何东西,只是将其传递给底层链 - 所以如果你实现自己的处理器链,你可以自由传递任何参数,但在大多数情况下OOTB 处理器有约定传递可能包含其他必需参数的映射。
OOTB Commerce 处理器的非常典型的代码(通常用于您自己的商业管道的自定义和扩展 - 遵循 OOTB 约定)是将参数作为映射传递,该映射将包含处理器内部所需的所有内容(在大多数情况下,它是Order
对象,有时Profile
和其他要求)。处理器本身通常没有任何依赖关系(通过 注入提供)。处理器要做的第一件事是将第一个参数转换为映射并提取功能所需的任何内容(检查其内部是否包含所有必需的内容)。
从理论上讲,它可以提供更好的模块化和逻辑解耦,前提是您具有基于接口的良好抽象(因此您可以将映射值转换为接口类型,而不是实现)。
例如,这里是典型处理器的代码片段
public int runProcess(Object pParam, PipelineResult pResult) throws Exception
{
HashMap map = (HashMap) pParam;
OrderManager mgr = (OrderManager) map.get(PipelineConstants.ORDERMANAGER);
Order order = (Order) map.get(PipelineConstants.ORDER);
if (order == null)
throw new InvalidParameterException("...");
if (mgr == null)
throw new InvalidParameterException("...");
// ... business logic
return SUCCESS;
}
PS我同意它可以设计得更好。然而,ATG 中还有一些其他“中世纪”的东西现在很奇怪且难以解释——但这可能没关系,请记住平台开发始于1991 年