0

runProcess()方法的定义PipelineManager

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

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

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

4

1 回答 1

3

我现在正在使用 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 年

于 2013-10-23T14:22:22.120 回答