我不明白如何在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