设计一个多模块项目

时间:2011-05-17 19:47:25

标签: java scala refactoring multi-module

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

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

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

3 个答案:

答案 0 :(得分:1)

如果您无法将原始客户端连接到服务器,那么我建议您进行以下模块细分:

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

答案 1 :(得分:1)

我担心我无法在Scala上提供任何内容,但就Java而言,您应该将新服务视为应用程序的Service层,而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);
    }

    ...
}

答案 2 :(得分:0)

嗯,这就是人们用XML和JSON做的事情,SOA的目标是什么,创建SOAP的内容,以及JMS等等。