PipelineManager
中runProcess()
方法的定义是
public PipelineResult runProcess(String pChainId, Object pParam)
throws RunProcessException
这给我的印象是,任何对象都可以作为第二个参数传递。但是,ATG OOTB 具有引用CommercePipelineManager
类PipelineManager
组件,该组件覆盖了runProcess()
方法和向下投射的 pParam 以map
并向其添加siteId
。
基本上,这会强制客户端代码仅发送 Map。因此,如果需要创建新的管道链,则必须使用map作为数据结构来传递数据。当然,人们总是可以通过创建一个新的PipelineManager
组件来解决这个问题,但我只是想知道在 CommercePipelineManager
中显式使用 map 背后的想法
我现在正在使用 ATG 9.X,我相信PipelineManager
本身不会将参数转换为任何东西,而只是将其传递给底层链 - 因此,如果您实现自己的处理器链,您可以自由传递任何参数,但在大多数 OOTB 处理器中,有传递可能包含其他所需参数的映射的约定。
OOTB 商务处理器(通常用于您自己的商业管道的自定义和扩展 - 遵循 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;
}
附言我同意它可以设计得更好。然而,ATG中还有其他一些"中世纪"的事情,现在很奇怪,很难解释 - 但请记住,平台开发始于1991年