コラボレーションアクターのシステムに暗黙的に要求コンテキストを伝搬したいと思います。アクターシステムで暗黙的に要求コンテキストを渡す
私のシステムには複数のアクターがあり、これらのアクターに渡されるメッセージにはこのRequestContextオブジェクトが含まれている必要があります。
ActorAはMessageAの処理の一部として、それがビジネスロジックを実行し、その後からMessageBを構築ActorAがActorBにメッセージを送信する必要がある場合、型MessageB
のメッセージを受信するタイプMessageA ActorBのメッセージを受信しますロジックの結果と同様にMessageAで利用可能RequestContextの、その後、私たちは、処理されるメッセージのスルーを持っている、と明示的にRequestContextの周りを渡すと面倒です
def handle(ma:MessageA) {
val intermediateResult = businessLogic(ma)
actorB ! MessageB(intermediateResult, ma.requestContext)
}
をActorBに送信します。
私は、受信メッセージに埋め込まれたRequestContextを送信メッセージに明示的に挿入するのを避けるために、Scalaのimplicits機能を使用する独創的な方法を試しています。
メッセージは大文字と小文字の区別があります。私は暗黙のルールについて読んだことがあるが、オブジェクトの属性を現在の暗黙のスコープに持っていくことは遠くに見える。
これは、共通の要件であるはずです。 提案がありますか?
ありがとうございました。
trait RequestContext
case class MessageA(req: RequestA, ctx: RequestContext)
object MessageA {
def apply(req: RequestA)(implicit ctx: RequestContext) = MessageA(req, ctx)
}
case class MessageB(req: RequestB, ctx: RequestContext)
object MessageB {
def apply(req: RequestB)(implicit ctx: RequestContext) = MessageB(req, ctx)
}
class Example extends Actor {
def receive = {
case MessageA(req, ctx) => handle(req)(ctx)
}
def handle(req: RequestA)(implicit ctx: RequestContext): Unit = {
val intermediateResult = businessLogic(req) // could take implicit ctx as well
actorB ! MessageB(intermediateResult)
}
}
しかし、宣言するときに、いくつかのオーバーヘッド依然として存在しているあなたが見ることができるように:このストレートフォワードを行い、問題のメッセージをお取り扱いが既に法に因数分解されて、あなたの例では、
答えをありがとう。私は真剣にこのアプローチを検討しましたが、パラメータを明示的に渡すことは、機能を使用するためにすべてのインポートとインプリケートを追加するよりもはるかに読みやすく、あまり冗長ではないと考えました。 – vishr
それが問題であれば、MessageA => MessageBというメッセージプロセッサを除外し、それをアクタ本体で呼び出すだけです。これはまた、テスト容易性を高めるだろう – Edmondo1984