2016-11-28 36 views
1

我不知道如何在ATG中使用repositoryItem。我如何需要構建定製的邏輯。ATG關於RepositoryItem的JavaBean

是否需要通過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的最佳實踐是什麼?

回答

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使用的相同設計模式。例如,「訂單」項目被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

ATG開箱的倉庫實現不使用大部分的JavaBeans。使用JavaBeans和將它們延遲加載到內存中的一個主要缺點是將失去許多存儲庫緩存功能,並會增加內存佔用量。例如,您將無法定期監視緩存統計信息或使緩存失效。當你從查詢中獲得巨大的repotiroyitem結果集時,你也會有實例化的開銷。

相反,您也可以使用DynamicBean,它允許您引用類似於java bean的存儲庫屬性,例如Profile.city。

如果您只想打包它們以便開發人員不會意外地錯誤地解析它們,則可以針對各種類型的現成寫入操作編寫每個存儲庫的util類,並集中您的類型安全性。

+0

你說得對。我的一點是 爲開發人員使用RepositoryItem的便利。在上課時最小化錯誤,將幾個對象作爲方法的參數傳輸,獲得屬性而沒有開銷。 –