Теория RequestFactory: почему Locator<>. Find() вызывается так часто?
Я новичок в RequestFactory, но с щедрой помощью Thomas Broyer, и после просмотра документов ниже становится намного лучше:)
Но не могли бы вы объяснить, почему Locator<>.find()
так часто (на мой взгляд) так часто называют?
В моем примере проекта у меня есть две сущности: организация и человек, которые поддерживают отношения между родителями и детьми. Когда я выбираю организацию, Objectify автоматически выбирает ребенка. Также я создал два метода в моем слое обслуживания findOrganizationById
а также saveOrganization
которые загружают и сохраняют объекты.
Теперь рассмотрим два сценария:
Когда я звоню 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 отправляет дельты на сервер, поэтому перед сохранением ему необходим весь объект. Тем не менее, так как я загружаю полный график сразу, было бы неплохо не иметь второй вызов, который 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();
}
}
1 ответ
Пары getId
а также find
в конце реализации по умолчанию Locator#isLive
: он предполагает, что объект является живым (то есть все еще существует в хранилище данных), если обнаружение его по его идентификатору возвращает ненулевое значение.
RF проверяет каждый EntityProxy
он когда-либо видел во время запроса / ответа на их жизнеспособность при построении ответа, чтобы сказать клиенту, когда объект был удален (на стороне клиента, он тогда запустит EntityProxyChange
событие с DELETE
операция записи.
Вы можете, конечно, переопределить isLive
в вашем Locator
с более оптимизированной реализацией, если вы можете ее предоставить.