GWT客户端和服务器的不同接口实现

时间:2014-12-11 20:16:13

标签: java gwt dependency-injection

假设我们在GWT项目的共享包中存在一些接口my.gwt.shared.Facade (存在服务器和客户端)以及它的两个实现: class my。 gwt.client.ClientFacadeImpl (仅存在客户端)和类my.gwt.server.ServerFacadeImpl (仅存在服务器)。

有没有办法编写一段代码或注释来替代客户端的 ClientFacadeImpl 和服务器端的 ServerFacadeImpl

2 个答案:

答案 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编译器你知道它不是客户端兼容的。