我有三个演员来处理CQRS情景。其中ProductWorkerActor负责命令部分,ProductQueryWorkerActor负责查询部分,ProductStateActor负责状态部分。
我处理查询的方式是使用:
ProductQueryWorkerActor.Ask<ProductState>("give-me-product-state-for-product-1000")
来自ProductQueryWorkerActor的代码:
if (message == "give-me-product-state-for-product-1000")
{
var actor = Context.ActorSelection("akka://catalogSystem/user/productState/1000");
var psDTO = actor.Ask<ProductStateDTO>(message).Result;
Sender.Tell(ps);
}
请忽略访问产品状态使用的路径。它是硬编码的,是为了使代码读起来更简单。
1.像我在这种情况下所使用的那样,我应该使用"Ask"来检索产品状态吗?"Ask"被称为"Future"吗?
2.我应该把状态暴露给外部工作而不是Actor本身作为DTO吗?
3.要更改产品的任何状态,我应该在"ProductWorkerActor"中处理消息处理还是在"ProductStateActor"本身中处理?在第二种情况下,"ProductWorkerActor"向"ProductStateWorker"发送一条消息,"ProductStateWorker"处理消息,更改状态并向"ProductWorkerActor"发送另一条消息,表示已通过验证并更改了状态。
Tell(message, Sender)
。在处理Actor选择时要小心 - 如果不是真正必要的话,就不应该使用它们。这方面有一些讲座。 - Bartosz Sypytkowski