被拘留的 Javabeong 超过 Repositorytem

ATG JavaBean over RepositoryItem

我不明白如何在 ATG 中使用 repositoryItem。我需要如何在其上构建自定义逻辑。

我需要在 repositoryItem 上创建普通的 JavaBean 还是我需要按原样使用它? 我会尽力解释:

  1. repositoryItem 上的逻辑:

    RepositoryItem store = getRepository().getItem(..);
    String address = store.getPropertyValue(..);
    
  2. JavaBean 上的逻辑:

    class StoreBean {
      String address;
    
      StoreBean(RepositoryItem store) {
        address = store.getPropertyValue(..);
     }
    }
    

然后我可以随心所欲地使用 StoreBean 来获取它的字段(例如,为它们延迟加载)。

ATG 中的最佳实践是什么?

这是一个偏好问题。

RepositoryItem 对象没有的是强类型检查。您必须假设您正在使用的 RepositoryItem 的类型,或者您必须在代码中进行手动检查(请参见下面的示例)。此外,由于 RepositoryItem 属性存储为元数据,您必须知道 1) 来自 XML 存储库描述符的属性的实际名称和 2) 您需要知道类型,这需要类型转换(示例:String firstName = (String) item.getProperty("firstName");)这是一个验证示例,以确保 RepositoryItem 对象的类型为 "sku":

RepositoryItemDescriptor skuItemDescriptor = getCatalogTools().getCatalog().getItemDescriptor(getCatalogTools().getBaseSKUItemType());
if (!RepositoryUtils.isTypeOfItemDesc(itemDescriptor, skuItemDescriptor)) {
    throw new IllegalArgumentException("RepositoryItem must be of type " + getCatalogTools().getBaseSKUItemType());
}

如果您采取不使用 "JavaBeans" 的方法,则会增加应用程序出现运行时错误的风险。我的建议是您在使用 RepistoryItem 对象和包装器对象之间保持健康的平衡。对于计划在大量代码库中使用的关键项,我建议使用包装器对象。

我建议,如果您创建包装器对象,为了保持一致性,请遵循 Oracle Commerce 使用的相同设计模式。例如,"order"项被OrderImpl包装并实现了ChangedProperties接口。

public class OrderImpl
extends CommerceIdentifierImpl
implements Order, ChangedProperties

http://docs.oracle.com/cd/E52191_03/Platform.11-1/apidoc/atg/commerce/order/OrderImpl.html

ATG 开箱即用的存储库实现大部分不使用 JavaBeans。使用 JavaBeans 并将它们延迟加载到内存中的一大缺点是会失去许多存储库缓存功能,并且会增加内存占用。例如,您将无法定期监控缓存统计信息或使缓存失效。当您从查询中获得巨大的 repotiroyitem 结果集时,您还将有实例化的开销。

相反,您也可以使用 DynamicBean,它可以让您引用类似于 java beans 的存储库属性,例如 Profile.city.

如果您只想包装它们以免开发人员不小心错误地解析它们,您可以为每个存储库编写一个 util class 用于各种类型的就绪写入操作并集中您的类型安全。