我不明白如何在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的最佳做法是什么?

最佳答案

这是一个优先事项。

使用RepositoryItem对象无法获得的是强类型检查。您必须对正在使用的RepositoryItem类型进行假设,或者必须在代码中进行手动检查(请参见下面的示例)。另外,由于RepositoryItem属性是作为元数据存储的,因此您必须知道1)XML存储库描述符中属性的实际名称,以及2)您需要知道类型,这需要类型转换(例如:)这是一个验证示例,以确保String firstName = (String) item.getProperty("firstName");对象的类型为“ 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使用的相同设计模式。例如,“订单”项由RepositoryItem包装并实现OrderImpl接口。

public class OrderImpl
extends CommerceIdentifierImpl
implements Order, ChangedProperties


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

09-27 18:32