假设我们在GWT项目的共享包中存在一些接口my.gwt.shared.Facade (存在服务器和客户端)以及它的两个实现: class my。 gwt.client.ClientFacadeImpl (仅存在客户端)和类my.gwt.server.ServerFacadeImpl (仅存在服务器)。
有没有办法编写一段代码或注释来替代客户端的 ClientFacadeImpl 和服务器端的 ServerFacadeImpl ?
答案 0 :(得分:1)
感谢大家的回答和讨论。我找到了满足我需求的简单而优雅的解决方案。
所以,我接口my.gwt.shared.Facade 和两个类: class my.gwt.client.ClientFacadeImpl 和 class my.gwt .server.ServerFacadeImpl 强>
interface Facade {
Map<Boolean, Facade> FACADES = new HashMap<Boolean, Facade>();
}
现在,我们应该填写你的FACADES界面。这是这样做的:
public class MyEntry implements EntryPoint {
static {
Facade.FACADES.put(true, ClientFacadeImpl.INSTANCE); // client side
}
和
@Startup
@Singleton
public class Initializer {
@PostConstruct
private void init() {
Facade.FACADES.put(false, ServerFacadeImpl.INSTANCE); // server side
// other things
}
}
现在,当我需要获得适当的Facade时,我只需编写
Facade facade = Facade.FACADES.get(GWT.isClient());
此外,在map中,map仅对应于服务器端或客户端实现。
P上。 S.这个问题的目标是允许处理在服务器上的客户端direclty上触发的一些GwtEvent,反之亦然。该解决方案大量删除了大量DTO(数据传输对象)和简化代码。
答案 1 :(得分:0)
除了“取决于”之外,你的问题没有答案。或者更确切地说,当然有办法做你所要求的,但你会接受这种权衡吗?
鉴于您使用依赖注入标记了问题,让我们从那开始。如果你使用带有GWT的DI工具,它可能是GIN(Dagger 2可以工作,但它仍在开发中)。在这种情况下,只需为GIN客户端和Guice服务器端使用不同的模块bind()
适当的实现。
对于一些版本,GWT.create()
可以在GWT(客户端)环境之外(即在服务器端)工作。您必须在ServerGwtBridge
上注册ClassInstantiator
,以替代gwt;xml
文件中的重新绑定规则。因此,您可以在<replace-with class="my.gwt.client.ClientFacadeImpl">
中使用gwt.xml
规则,并在服务器端返回ClassInstantiator
ServerFacadeImpl
。
最后,您还可以使用静态工厂,并通过<super-source>
将其替换为客户端特定版本。
最后一个,但我不确定它是否有效:您可以使用if
/ else
使用GWT.isClient()
,并使用{注释ServerFacadeImpl
{1}}告诉GWT编译器你知道它不是客户端兼容的。