2011-05-17 65 views
0

我不熟悉这个概念,所以我可能会错误地称它为“多模块项目”。在我制作的软件中,有一个独特的单元具有不同的输入和输出。我决定把它作为一个单独的(web)服务来运行,因为它在这种独立模式下具有其他的价值。设计一个多模块项目

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

该软件正在使用Scala运行在JVM上,并且可能影响或不影响这个故事。

回答

1

如果你不能有你的原始客户端AP连接到服务器,然后我会建议以下模块的故障:

  • 服务模块与Java/Scala的API
  • 包装了服务模块与REST/XML/JSON
  • 客户端模块
  • Web服务模块它直接调用Java/Scala API模块
+0

这听起来不错,现在什么是最好的优雅的条款在建立?我每次构建客户端时是否都需要构建服务器(这是否称为多模块构建?)或者我只是将它打包并添加为客户端应用程序的依赖项?谢谢。 – parsa 2011-05-18 07:16:03

+0

每个模块都将生成自己的工件 - jar文件,或者可能是Web服务模块的war文件或ear文件。第二个和第三个模块将依赖于第一个模块,即将第一个jar包含在它们的编译时和运行时类路径中。像Maven这样的构建工具将为开发多模块项目提供支持。 – 2011-06-22 11:40:22

0

嗯,这几乎是什么人做的XML和JSON,什么SOA的目标是什么SOAP是为创建加之类的东西JMS等

1

恐怕我不能在Scala前端提供任何东西,但就Java而言,您应该将新服务视为您的应用程序的服务层,而REST/SOAP /无论您的服务的接口在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); 
    } 

    ... 
}