2017-09-26 9 views
0

私はAkkaのアクターを使って内部的に実装されたリアクティブライブラリを開発しています。このライブラリをserverと呼ぶことにしましょう。ライブラリはそのAPIとして単一のタイプのActorを公開します。このアクタは、パブリックインターフェイスを定義するさまざまなタイプのメッセージを受け入れます。これらのメッセージが以下のように定義されているとしましょう。Akkaの2つのプロジェクト間でメッセージの種類を共有します

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

ここで、上記のライブラリを使用するプログラムも実装する必要があります。このプログラムをclientと呼ぶことにしましょう。このプログラムでは、Acckaアクターを使用して、ライブラリーと統合することもできます。例えば、askパターン(残りのアプリケーションはアクターを使用して開発されていません)を使用します。明らか

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

は、タイプCreationCreationAckserverおよびclientの両方利用可能である必要があり、上記のコードにコンパイルできるようにします。

私の質問は、CreationCreationAckのような公開メッセージを2つのプロジェクトで共有するのに最適なアプローチはどれですか?各プログラムをビルドするには、sbtを使用しています。

答えて

2

serverライブラリでメッセージをパッケージ化します。メッセージはライブラリのパブリックAPIを表すためです。このライブラリを使用するプログラムは、必要なパッケージとクラスをserverにインポートできます。

メッセージが別のプロジェクトを作成すると、メッセージがserverclient(およびその他のもの)の両方が実装されたインターフェイスであれば意味があります。しかし、あなたの説明に基づいて、これは当てはまりません。むしろ、メッセージとそのメッセージがAPIである実装は、具体的にはserverに関連付けられています。 clientはこれらのメッセージを何らかの方法で実装していません。それは単にserverライブラリのユーザーです。

ポイントを再入力するために、メッセージは公開APIのserverであり、そのライブラリに緊密に結合されています。メッセージはserverにバンドルする必要があります。

+0

あなたが言ったことを達成するためにsbtとプロジェクト構造を設定する方法の例を教えてください。 –

1

別のプロジェクト(例:messages)を作成し、その中にこの種の共通オブジェクトとクラスを実装することをお勧めします。

その後、使用するプロジェクトでこのライブラリをインポートします。あなたの場合、build.sbtファイルにserverclientプロジェクトの両方で追加してください。

このようにすると、異なるプロジェクトで同じクラスを使用できるようになります。

+0

したがって、私はphisically同じコードを指す必要があります。私は 'client'プロジェクトの中で同じクラスを複製することはできません。 –

+0

はい、同じコードを指します。 異なるプロジェクトで同じクラスを複製することは、ベストプラクティスではありません。それが可能かどうかはわかりません。これを実現するには、パッケージ名も同じであることを確認する必要があります。繰り返しますが、それは最良のアイデアではありません。 – fcat

+0

これは問題ありません。 SBTを使って、どのアプローチをお勧めしますか?つまり、 'server'ライブラリにサブプロジェクトを持つことや、完全に分離したプロジェクトを作る方が良いでしょうか? –

関連する問題