RequestFactory 理论:为什么 Locator<>.find() 被如此频繁地调用?

2023-11-24

我是 RequestFactory 的新手,但得到了慷慨的帮助托马斯·布罗耶在查看了下面的文档之后,情况变得好多了:)

  • RequestFactory 入门
  • 请求工厂移动部件
  • GWT 2.4 中的 RequestFactory 更改

但你能解释一下原因吗Locator<>.find()(在我看来)经常被不必要地调用吗?

在我的示例项目中,我有两个维护父子关系的实体组织和人员。当我获取组织对象化时自动地获取子 Person。 我还在服务层创建了两个方法findOrganizationById and 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除此之外还有两次吗?数据存储上的额外负载让我付出了金钱代价。当然,我缓存了它,但修复它会很干净。如何避免这些额外的调用?

当我通过调用保存对象时会发生类似的事情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)))

我可以理解需要从 DataStore 获取两个对象before更新它。 RequestFactory 将增量发送到服务器,因此在持久化之前需要拥有整个对象。不过,由于我立即加载完整的图表,最好不要进行第二次调用,即PojoLocator.find(Key<?>(Organization(1)/Person(2)))。我真的无法理解需要.find() calls after坚持。

想法?

我的代理

@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();
    }
}

的对getId and find最后是默认实现Locator#isLive:它假设一个对象是live(即仍然存在于数据存储中)如果通过其 ID 找到它返回非空值。

RF 检查每个EntityProxy它在请求/响应期间见过liveness在构建响应时,告诉客户端实体何时被删除(在客户端,然后它会触发EntityProxyChange事件与DELETE 写操作.

你当然可以覆盖isLive在你的Locator如果您能提供一个更优化的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RequestFactory 理论:为什么 Locator<>.find() 被如此频繁地调用? 的相关文章

随机推荐