2012-02-28 37 views
8

我是新來RequestFactory但隨着Thomas Broyer鼎力相助和審查它下面的文件後,是越來越好很多:)RequestFactory理論:爲什麼Locator <>。find()經常被調用?

但你能不能請解釋爲什麼Locator<>.find()經常被不必要地調用(在我看來)?

在我的示例項目中,我有兩個實體Organization和Person來維護父子關係。當我取組織物化自動取孩子人。 此外,我在我的服務層findOrganizationByIdsaveOrganization中創建了兩種加載和保留對象的方法。

現在考慮兩種方案:

當我調用客戶端findOrganizationById以下調用發生在服務器端:

OrderDao.findOrganizationById(1) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 

通過調用OrderDao.findOrganizationById我已經收到對象的全圖。除此之外,爲什麼要撥打.find兩次? Datastore的額外負擔使我花錢。當然我會緩存它,但修復它會很好。我怎樣才能避免這些額外的電話?

當我通過在客戶端調用saveOrganization保存對象時,會發生類似的情況。以下調用發生在服務器端:

PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 
OrderDao.saveOrganization(1) 
PojoLocator.getId(Key<?>(Organization(1))) 
PojoLocator.find(Key<?>(Organization(1))) 
PojoLocator.getId(Key<?>(Organization(1)/Person(2))) 
PojoLocator.find(Key<?>(Organization(1)/Person(2))) 

我可以理解需要之前取出由數據存儲兩個對象進行更新。 RequestFactory發送deltas給服務器,所以它在持久化之前需要擁有整個對象。仍然因爲我一次加載完整的圖表,它不會有第二個電話是PojoLocator.find(Key<?>(Organization(1)/Person(2)))。我真的不明白在堅持後需要.find()調用

想法?

我的代理

@ProxyFor(value = Organization.class, locator = PojoLocator.class) 
public interface OrganizationProxy extends EntityProxy 
{ 
    public String getName(); 
    public void setName(String name); 
    public String getAddress(); 
    public void setAddress(String address); 
    public PersonProxy getContactPerson(); 
    public void setContactPerson(PersonProxy contactPerson); 
    public EntityProxyId<OrganizationProxy> stableId(); 
} 

@ProxyFor(value = Person.class, locator = PojoLocator.class) 
public interface PersonProxy extends EntityProxy 
{ 
    public String getName(); 
    public void setName(String name); 
    public String getPhoneNumber(); 
    public void setPhoneNumber(String phoneNumber); 
    public String getEmail(); 
    public void setEmail(String email); 
    public OrganizationProxy getOrganization(); 
    public void setOrganization(OrganizationProxy organization); 
} 

我的服務

public interface AdminRequestFactory extends RequestFactory 
{ 
    @Service(value = OrderDao.class, locator = InjectingServiceLocator.class) 
    public interface OrderRequestContext extends RequestContext 
    { 
     Request<Void> saveOrganization(OrganizationProxy organization); 
     Request<OrganizationProxy> findOrganizationById(long id); 
    } 

    OrderRequestContext contextOrder(); 
} 

,最後我的定位<>

public class PojoLocator extends Locator<DatastoreObject, String> 
{ 
    @Inject Ofy ofy; 

    @Override 
    public DatastoreObject create(Class<? extends DatastoreObject> clazz) 
    { 
     try 
     { 
      return clazz.newInstance(); 
     } catch (InstantiationException e) 
     { 
      throw new RuntimeException(e); 
     } catch (IllegalAccessException e) 
     { 
      throw new RuntimeException(e); 
     } 
    } 

    @Override 
    public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id) 
    { 
     Key<DatastoreObject> key = Key.create(id); 
     DatastoreObject load = ofy.load(key); 
     return load; 
    } 

    @Override 
    public Class<DatastoreObject> getDomainType() 
    { 
     return null; // Never called 
    } 

    @Override 
    public String getId(DatastoreObject domainObject) 
    { 
     Key<DatastoreObject> key = ofy.fact().getKey(domainObject); 
     return key.getString(); 
    } 

    @Override 
    public Class<String> getIdType() 
    { 
     return String.class; 
    } 

    @Override 
    public Object getVersion(DatastoreObject domainObject) 
    { 
     return domainObject.getVersion(); 
    } 
} 

回答

6

getIdfind在年底對是Locator#isLive的默認實現:它假定對象是live(即,仍然存在於數據存儲中),如果通過其ID發現​​它返回一個非空值。

RF檢查每個爲他們活躍構建響應時,告訴當實體已被刪除(在客戶端,客戶端,它會那麼火的EntityProxyChange事件的請求/響應期間,見過EntityProxyDELETE寫操作

當然你也可以覆蓋你的LocatorisLive用更優化的實現,如果你能提供一個。

+0

覆蓋後'將isLive()'我證實,這是正確的答案。 – expert 2012-03-02 03:21:51

相關問題