저는 액터 협업 시스템에 암묵적으로 요청 컨텍스트를 전파하고자합니다.액터 시스템에 암묵적으로 요청 컨텍스트 전달
상황을 단순화하고 표시하려면 시스템에 여러 개의 액터가 있고이 액터로 전달 된 메시지에이 RequestContext 객체가 포함되어 있어야합니다.
ActorA 타입 MessageA의 메시지를 수신 ActorB 타입 MessageB의 메시지 ActorA가 MessageA의 처리의 일부로서, ActorB에 메시지를 전송할 필요
, 그것은 비즈니스 로직을 수행하고, 그 다음부터 MessageB를 구성 받는다 다음 논리뿐만 아니라 MessageA에서 사용할 수있는 RequestContext의 결과와는
def handle(ma:MessageA) {
val intermediateResult = businessLogic(ma)
actorB ! MessageB(intermediateResult, ma.requestContext)
}
을 ActorB에 보내는 우리는 메시지의 회전을 어떻게 처리해야하고, 명시 적으로 requestContext 주위에 통과하는 것이 부담이다.
스칼라의 implicits 기능을 사용하여 들어오는 메시지에 포함 된 RequestContext를 나가는 메시지에 명시 적으로 주입하는 것을 피하기 위해 창의적인 방법을 시도하고 있습니다.
메시지는 사례 클래스이며 필요합니다. 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