【问题标题】:Designing a multi-module project [closed]设计一个多模块项目[关闭]
【发布时间】:2011-08-27 12:49:30
【问题描述】:

我是这个概念的新手,所以我将其称为“多模块项目”可能是错误的。在我正在制作的软件中,有一个具有不同输入和输出的不同单元。我决定将其拉出并作为单独的(Web)服务运行,因为它在此独立模式下具有其他值。

但问题是,以前与此单元混合的应用程序现在也必须独立运行。这意味着它应该有一种新的方式通过调用它的服务端点来与该单元通信,这增加了新的复杂层(将不太简单的数据序列化和反序列化为 XML 和 JSON)。在软件工程中是否有这种常见做法?我可以通过其他方式传输数据吗?

该软件是用 Scala 编写的,它在 JVM 上运行,可能会也可能不会影响这个故事。

【问题讨论】:

    标签: java scala refactoring multi-module


    【解决方案1】:

    如果您无法让原始客户端连接到服务器,那么我建议您使用以下模块分解:

    • 带有 Java/Scala API 的服务模块
    • Web 服务模块,用 Rest/XML/JSON 包装服务模块
    • 直接调用 Java/Scala API 模块的客户端模块

    【讨论】:

    • 听起来不错,现在在构建优雅方面最好的是什么?每次构建客户端时是否需要构建服务器(这是否称为多模块构建?)或者我只是将其 jar 并将其作为依赖项添加到客户端应用程序?谢谢。
    • 每个模块都会产生自己的工件——一个jar文件,或者web服务模块的war文件或ear文件。第二个和第三个模块将依赖于第一个,即,将在其编译时和运行时类路径中包含第一个 jar。 Maven 等构建工具将为开发多模块项目提供支持。
    【解决方案2】:

    恐怕我无法在 Scala 前端提供任何东西,但就 Java 而言,您应该将新服务视为位于应用程序的服务层,而 REST/SOAP/Whatever 接口您的服务是在 Web/Servlet 层中定义的。

    假设您的 com.myco.services 包中有如下服务:

    public interface PersonService {
        public Person createPerson(PersonIdentifier id, PersonType type);
        public Person retrievePerson(PersonIdentifier id);
        public void updatePerson(Person existingPerson);
        public void deletePerson(Person existingPerson);
        public boolean authenticatePerson(String personName, String password);
    }
    

    我们会认为您有一个 PersonServiceImpl 实现来更新您的数据库或其他任何东西。在同一 JVM 上的应用程序中,您可以将 PersonServiceImpl 注入代码并直接调用方法,而无需编组或解组参数。

    在 Web 层中,您可以有一个单独的 PersonServiceController,它映射到您的 servlet 中的 URL。当像“http://myco.com/person/update”这样的 URL 被点击时,请求的主体可以像这样传递给控制器​​:

    public class PersonServiceController {
        private final PersonService personService; // Inject PersonServiceImpl in constructor
        ...
    
        public void updatePerson(String requestBody) {
            Person updatedPerson = unmarshalPerson(requestBody);
            this.personService.updatePerson(updatedPerson);
        }
    
        ...
    }
    

    【讨论】:

      【解决方案3】:

      嗯,这几乎就是人们使用 XML 和 JSON 所做的事情,SOA 的目标是什么,创建 SOAP 的目的,以及 JMS 之类的东西等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-29
        • 2012-06-30
        • 2021-05-26
        • 2011-02-11
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        相关资源
        最近更新 更多