2017-09-26 75 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'庫中有一個子項目還是要有一個完全分離的項目? –