ATG CommercePipelineManager的设计问题

时间:2013-10-22 15:50:56

标签: design-patterns atg atg-dynamo

runProcess()PipelineManager方法的定义是

public PipelineResult runProcess(String pChainId, Object pParam)
            throws RunProcessException

这让我觉得任何对象都可以作为第二个参数传递。但是,ATG OOTB有PipelineManager个引用CommercePipelineManager类的组件,它会覆盖runProcess()方法,并将pParam向下转换为map并向其添加siteId

基本上,这会强制客户端代码仅发送Map。因此,如果需要创建一个新的管道链,必须使用map作为数据结构来传递数据。当然,人们可以通过创建一个新的PipelineManager组件来解决这个问题,但我只是想知道明确使用CommercePipelineManager中的地图背后的想法

1 个答案:

答案 0 :(得分:3)

我现在正在使用ATG 9.X,我相信PipelineManager本身不会将参数转换为任何内容并将其传递给基础链 - 所以如果你实现自己的处理器链,你可以自由地传递任何参数,但在大多数OOTB处理器中都有约定来传递可能包含其他必需参数的地图。

非常典型的 OOTB 商务处理器代码(通常用于您自己的定制和商业管道扩展 - 遵循OOTB惯例)是将参数作为一个地图传递,其中包含处理器(在大多数情况下是Order个对象,有时是Profile和其他必需品。 处理器本身通常没有任何依赖关系(通过 injection 提供)。 处理器要做的第一件事就是将第一个参数转换为地图并提取功能所需的任何内容(检查它是否包含所有必需的内容)。

理论上它可以提供更好的模块化和逻辑解耦,为您提供基于接口的良好抽象(因此您可以将地图值转换为接口类型,而不是实现)。

E.g。这是典型处理器的代码片段

  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;
  }

P.S。我同意它可以设计得更好。然而,ATG中还有一些其他“中世纪”的东西现在很奇怪而且难以解释 - 但它可能没问题,请记住平台开发始于1991