2017-09-26 2 views
0

Je développe une bibliothèque réactive qui est implémentée en interne en utilisant des acteurs Akka. Appelons cette bibliothèque server. La bibliothèque expose un seul type d'acteur en tant qu'API. Cet acteur accepte différents types de messages, qui définissent son interface publique. Disons que ces messages sont définis comme suit.Partager le type de messages entre deux projets dans Akka

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

Maintenant, je dois également implémenter un programme qui utilise la bibliothèque ci-dessus. Appelons ce programme client. Ce programme utilisera également Akka Actors pour s'intégrer à la bibliothèque, par exemple en utilisant le modèle ask (le reste de l'application n'est pas développé en utilisant des acteurs).

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

Il est clair que, pour laisser la compilation du code ci-dessus, les types Creation et CreationAck doivent être disponibles à la fois pour server et client.

Ma question est: Quelle est la meilleure approche pour partager les messages publics comme Creation et CreationAck parmi les deux projets? Pour construire chaque programme que j'utilise sbt.

Répondre

2

Collez les messages avec la bibliothèque server, car les messages représentent l'API publique de la bibliothèque. Tout programme qui souhaite utiliser cette bibliothèque peut alors importer les packages et classes server nécessaires.

La création d'un projet distinct pour les messages pourrait avoir un sens si les messages étaient une interface à la fois server et client (et potentiellement d'autres) implémentée. Mais ce n'est pas le cas, basé sur votre description. Au contraire, les messages et l'implémentation pour laquelle les messages sont l'API sont spécifiquement liés à server. client ne mettre en œuvre ces messages de toute façon; c'est simplement un utilisateur de la bibliothèque server.

Pour réitérer le point, les messages sont l'API publique de server et sont étroitement couplés à cette bibliothèque. Les messages doivent être groupés avec server.

+0

Ok, pouvez-vous me donner un exemple de comment configurer sbt et la structure du projet pour réaliser ce que vous avez dit? –

1

Je vous recommande de créer un autre projet (ex: messages) et d'implémenter ce type d'objets communs et de classes à l'intérieur.

Ensuite, importez cette bibliothèque dans le projet que vous souhaitez utiliser. Dans votre cas, ajoutez-le à vos fichiers build.sbt dans les projets server et client. En faisant cela, vous serez en mesure d'utiliser les mêmes classes dans différents projets.

+0

Donc, je dois pointer phisically vers le même code. Je ne peux pas reproduire les mêmes classes dans le projet 'client', n'est-ce pas? –

+0

Oui, vous pointez le même code. Répliquer les mêmes classes dans différents projets ne sera pas la meilleure pratique à coup sûr. Et je ne suis pas sûr que ce soit possible. Parce que pour ce faire, vous devez vous assurer que les noms de paquets sont également les mêmes. Encore une fois, ce n'est pas la meilleure idée. – fcat

+0

C'est bon. En utilisant SBT, quelle approche suggérez-vous? Je veux dire, est-il préférable d'avoir un sous-projet dans la bibliothèque 'server' ou d'avoir un projet complètement séparé? –