我不了解如何在ATG中使用repositoryItem。我如何在其上构建自定义逻辑。
我是否需要在repositoryItem上创建通常的JavaBean,或者我需要按原样使用它? 我会试着解释一下:
repositoryItem上的逻辑:
RepositoryItem store = getRepository().getItem(..);
String address = store.getPropertyValue(..);
JavaBean上的逻辑:
class StoreBean {
String address;
StoreBean(RepositoryItem store) {
address = store.getPropertyValue(..);
}
}
然后我可以使用StoreBean我想要的,获取它们的字段(例如,延迟加载它们)。
ATG的最佳做法是什么?
答案 0 :(得分:3)
这是一个偏好的问题。
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
答案 1 :(得分:1)
ATG开箱即用存储库实现大多数情况下不使用JavaBeans。使用JavaBeans并将其延迟加载到内存中的一大缺点是会丢失许多存储库缓存功能,并会增加内存占用。例如,您将无法定期监视缓存统计信息或使缓存无效。当您从查询中获得巨大的repotiroyitem结果集时,您还将获得实例化的开销。
相反,您也可以使用DynamicBean,它允许您引用类似于例如Profile.city的Java bean的存储库属性。
如果您只想将它们包装起来,以免开发人员意外地错误地解析它们,那么您可以为每个存储库编写一个util类,用于各种类型的就绪写入操作,并集中管理您的类型安全。