如何在具有不同接收器实现的情况下附加请求上下文

Lop*_*hin 3 gwt requestfactory

在Google io 2011中,David Chandler提到您可以使用append()方法链接不同的请求上下文,但在实践中,我不知道如何在它们具有不同的接收器时将它们链接起来,使用to()然后触发( )?

请帮忙.

Tho*_*yer 6

有两种类型的接收器:绑定到每个方法调用(将传递给所述的那些Requestto()方法),并在上下文一级(即传递给所述RequestContextfire()方法).这个方法是一个简单Requestfire(Receiver)方法to(receiver).fire(),即它绑定Receiver到方法.

该方法级接收机取决于方法而已,他们的通用参数取决于方法的返回值(的泛型参数RequestInstanceRequest),所以不管你append()几个RequestContext小号一起变化绝对没有.

上下文级接收器始终参数化Void.当您append()一起上下文时,它们实际上形成了具有多个接口的单个上下文,因此您只能fire()在任何一个附加的上下文中调用一次.

现在让我们回到基础:不使用append(),您只能批量调用在上下文接口上声明的方法.如果您要使用两个不同的上下文接口,则必须生成两个fire(),即两个HTTP请求.引言append()允许您批量调用在任何上下文接口上声明的方法:简单地将上下文附加到另一个上下文,并且两个上下文中的调用将在同一HTTP请求中一起批处理,由fire()任何一个上下文中的唯一触发附加.

现在进入技术细节:在内部,上下文只不过是一个状态对象的薄包装器.当您edit()create()代理将其添加到内部状态时,当您调用服务方法时,方法名称(实际上是其混淆的标记)和参数也会被捕获并推送到该状态.当你append()是一个上下文时,你只是让它与你追加它的上下文之一共享它的内部状态.这样,当您在附加上下文上调用服务方法时,它将推送到与其他上下文完全相同的状态,并且当您中的fire()任何一个上下文时,状态将被序列化为单个HTTP请求.
请注意,要附加上下文,其自身的内部状态必须为空,否则将引发异常,因为状态将被抛弃以替换为其他上下文之一.

简而言之,在实践中:

FirstContext first = rf.first();
SomeProxy proxy = first.create(SomeProxy.class);
...
SecondContext second = first.append(rf.second());
OtherProxy other = second.create(OtherProxy.class);
other.setSome(proxy);
...
second.saveAndReturnSelf(other).to(new Receiver<OtherProxy>() {
   ...
});
...
first.fire();
Run Code Online (Sandbox Code Playgroud)

请注意,创建和附加第二个上下文的行同样可以写成:

SecondContext second = rf.second();
first.append(second);
Run Code Online (Sandbox Code Playgroud)

append方法返回其参数是为了方便,但它实际上与您传递给参数的值相同.这只是为了允许在上面写上单线,而不是被迫使用双线.