【问题标题】:GWT Request Factory - Several entity locators for the same entity typeGWT 请求工厂 - 同一实体类型的多个实体定位器
【发布时间】:2011-07-17 00:31:41
【问题描述】:

我希望能够为同一个域对象使用不同的实体定位器。我使用Twig,它可以选择完全或部分加载对象。当我运行 lite 请求 fetchRangeLite 时,使用定位器 TwigLocator 而不是 TwigLiteLocator。我目前的实现是:

代理

@ProxyFor(value = MyDomain.class, locator = TwigLocator.class)
public interface MyDomainProxy extends EntityProxy {}

@ProxyFor(value = MyDomain.class, locator = TwigLiteLocator.class)
public interface MyDomainLiteProxy extends EntityProxy {}

请求

@Service(value = MyDao.class, locator = DaoServiceLocator.class)
public interface MyRequest extends RequestContext {
    Request<List<MyDomainProxy>> fetchRange(Integer start, Integer length);
    Request<Integer> getCount();
    Request<List<MyDomainLiteProxy>> fetchRangeLite(Integer start, Integer length);
}

public List<MyDomain> fetchRange(Integer start, Integer length) {
  ...   
}

public List<MyDomain> fetchRangeLite(Integer start, Integer length) {
  ...   
}

我期待使用 lite 定位器,但事实并非如此。那么 RF 如何为特定的域类型选择它应该使用的定位器呢?

更新

我的域对象由列表组成。

public class MyDomain extends DatastoreObject {
  private List<A> a;
}

public class A {
  private List<B> b;
}

当我的MyDomain 对象的代理从服务器发送到客户端时,Twig 还会加载所有A 和所有B 需要时间。我只对MyDomain 对象中的一个属性感兴趣,这就是我想使用“lite”定位器的原因。

树枝定位器

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

TwigLiteLocator

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    myDatastore.setActivationDepth(0);
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

myDatastore.setActivationDepth(0); 告诉数据存储仅加载MyDomain 中的属性,而不是子级别(列表)属性。

DAO 实现相同,因此两个代理的 ID 和版本相同。

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    我不确定为什么 RF 不使用“lite”定位器,但我也不确定为什么这可能是一个问题:MyDomain 的 ID 和版本不应该相同,无论代理是什么用过吗?

    实际上,我不明白为什么在这种情况下您确实需要两个不同的定位器:“完整”或“精简”提取是在您的 DAO 中完成的,而不是在定位器中。拥有两个不同定位器的唯一原因是在将代理从客户端发送到服务器时以不同的方式实现findfind 的默认实现也使用isLive但通常最好用您自己的实现覆盖它,除非默认的已经是“最佳优化”的:find(obj.getClass(), getId(obj)) != null)

    【讨论】:

    • 查看更新,何时调用find 方法?是只有在客户端向服务器发送代理时,还是在服务器向客户端发送代理时也调用?
    • find 仅在您从服务器发送到客户端时由isLive 的默认实现调用。 isLive 为给定调用(客户端到服务器和服务器到客户端)中看到的所有实体调用。 find 将在从客户端发送到服务器以获取要应用“差异”的对象时直接调用(因为 RF 仅通过线路发送差异以进行客户端到服务器的通信)。
    • ValueProxy 是如何工作的?似乎根本没有调用定位器。我会失去“差异”功能,但我不在乎,因为我正在处理部分加载的对象。顺便说一句,我在 CellBrowser 中使用代理,这就是为什么在更高级别我不需要所有信息。
    • 对于ValueProxys,只调用了Locatorcreate 方法:没有ID 或版本,因此也不需要findisLive。而getDomainType 实际上从未被调用过(即使是EntityProxy)。
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多