2017-09-26 72 views
0

我正在开发一个内部使用Akka actors实现的反应性库。我们称这个库为server。该库公开一种类型的Actor作为其API。该Actor接受定义其公共接口的不同类型的消息。假设这些消息被定义为以下内容。在Akka的两个项目中共享消息类型

sealed trait Request 
case class Creation(name: String) extends Request 
sealed trait Response 
case class CreationAck(name: String) extends Response 

现在,我还必须实现一个使用上述库的程序。我们称这个程序为client。此程序还将使用Akka Actor与图书馆集成,例如使用询问模式(应用程序的其余部分不是使用参与者开发的)。

implicit val timeout = Timeout(5 seconds) 
def create(): Future[CreationAck] = (mainActor ? Creation).mapTo[CreationAck] 
// And so on... 

显然,让编译上述代码,类型CreationCreationAck必须提供既serverclient

我的问题是:在这两个项目中哪个是最好的方法来共享像CreationCreationAck这样的公共消息?构建我正在使用的每个程序sbt

回答

2

将消息与server库打包,因为消息表示库的公共API。任何希望使用这个库的程序都可以导入必要的server包和类。

如果消息是serverclient(以及其他潜在的)实现的接口,则为消息创建单独的项目可能有意义。但根据你的描述,情况并非如此。相反,这些消息以及消息是API的实现都与server有关。 client不以执行这些消息;它只是server库的用户。

重申一点,这些消息是server的公共API,并紧密耦合到该库。这些消息应该与server捆绑在一起。

+0

好的,你能举个例子来说明如何配置sbt和项目结构来实现你所说的吗? –

1

我建议你创建另一个项目(例如:messages)并在其中实现这些类型的通用对象和类。

然后,导入您想要使用哪个项目的库。在你的情况下,将其添加到serverclient项目中的build.sbt文件中。

通过这样做,您将能够在不同的项目中使用相同的类。

+0

所以,我需要指向phisically相同的代码。我不能在'client'项目中复制相同的类,我可以吗? –

+0

是的,你会指向相同的代码。 在不同的项目中复制相同的类并不是最好的做法。我不确定这是否可能。因为要实现这一点,您需要确保包名称也是相同的。再次,这不是最好的主意。 – fcat

+0

没关系。使用SBT,你建议采用哪种方法?我的意思是,在'server'库中有一个子项目还是要有一个完全分离的项目? –