【问题标题】:Design pattern for a client Server app客户端服务器应用程序的设计模式
【发布时间】:2014-05-28 00:10:34
【问题描述】:

我们在 GWT 中有一个客户端服务器应用程序。来自客户端浏览器的用户将获得所提供服务的选项。

我想通过单个 RPC(远程过程调用)方法发送所有请求。这意味着我会发送一个字符串,代表服务,服务器会收到这个字符串并返回结果。

现在,由于这将通过单个 RPC 请求,我只能选择向客户端返回单一类型的结果,并且它必须是可序列化的(不能返回 java 对象)。

例如,用户可以想要 Users ,应用程序将返回用户对象列表,或者用户可以想要交易,服务器将返回 List 交易对象,或者将来用户可以要求 Apple 和服务器将返回一个字符串。

想要收集所有服务并将其置于策略或命令模式下,但每个服务可以返回不同的类型,我该如何解决这个问题?或者你们认为哪种模式最好?

我能想到的最好的办法是有一个 Wrapper 对象,它将包含所有服务的所有不同返回类型,在服务器上设置它,并在客户端获取结果,但它看起来有点乱。

感谢任何建议。

请注意服务器执行 Java 代码 (Servlet),所以这是一个 Java 问题,客户端基本上是 Java,但有限制,因为 GWT 在编译时将其转换为 JavaScript。

谢谢。

【问题讨论】:

  • 我想到的另一种方法是有一个标记接口(例如 Returnable),并将每个返回类型包装在接口周围并投射到客户端。仍然看起来像代码气味。请帮忙。
  • 我不想听起来粗鲁,但我认为你问错了问题。 “通过单个 RPC(远程过程调用)方法发送所有请求”有什么意义?如果这样做,您将失去 Java(和 GWT)静态类型,这是它的主要优势之一。
  • 您好,谢谢,一点也不粗鲁,我只是想设计一种方法,这样我就可以强制执行打开关闭原则,而不需要我在每次引入新服务时更新和编辑代码。虽然最好只从客户端发送一个字符串,但让 Spring 获取正确的 bean,将其放在策略模式中获取结果并将其显示在客户端上
  • 我想我只是没有足够的关于您的域的信息。我想我明白你的意思,但我无法想象拥有新类型的新服务并且不需要新代码的用例。

标签: java gwt design-patterns client-server rpc


【解决方案1】:

在我们的项目中,我们已经完成了您正在寻找的事情:一个单独的 RPC 函数,它将打包的请求传输到服务器,服务器执行相应的代码,然后再次将结果返回给客户端。其中有多少是臭代码——我不确定。但这里是我们所做工作的简要总结:

RPC 功能:

public <P extends Command<R>, R extends CommandReturnValue> R execute(P command) throws SharedException;

其中Command&lt;T extends CommandReturnValue&gt; 和CommandReturnValue 是扩展com.google.gwt.user.client.rpc.IsSerializable 的空接口。每个命令实现都有其对应的 CommandReturnValue 实现,它可以包装任何 GWT 可序列化对象。

CommandReturnValue 示例:

public class SaveCommandReturnValue implements CommandReturnValue{

    private String errorMessage;

    // getter and setter and other important information to return

}

示例对应命令:

public class SaveCommand implements Command<SaveCommandReturnValue>{

    private List<String> stringsToSave;

    // other serializable fields and their getters + setters

}

RPC 函数的服务器端实现然后根据命令类分派调用。在我们的例子中,每个命令都有一个实现类(实现CommandImplementation&lt;T extends Command, U extends CommandReturnValue&gt;)。

示例实现:

public class SaveCommandImpl implements CommandImplementation<SaveCommand, SaveCommandReturnValue>{

    @Override
    public SaveCommandReturnValue execute(SaveCommand command){

         // code to save whatever the command says to save
    }
}

我们在服务器端使用 Spring,因此将实现注册为 Spring-bean 并使用 Spring-bean-name 注释命令是一件简单的事情。调度程序首先在传入的命令中搜索 Spring-bean-name 注释,从应用程序上下文中获取正确的 CommandImplementation-bean,然后调用 bean 的“执行”方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多