【发布时间】:2019-05-31 22:11:04
【问题描述】:
我对 Scala 和 Akka 都很陌生,我正在尝试弄清楚如何创建一个合适的域模型,它也是一个 Actor。
假设我们有一个简单的商业案例,您可以在其中开设一个新的银行账户。假设其中一条规则是每个姓氏只能创建一个银行账户(不现实,只是为了简单起见)。我的第一种方法,不应用任何业务规则,看起来像这样:
object Main {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("accout")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
val account = system.actorOf(Props[Account])
account ! CreateAccount("Doe")
}
}
case class CreateAccount(lastName: String)
class Account extends Actor {
var lastName: String = null
override def receive: Receive = {
case createAccount: CreateAccount =>
this.lastName = lastName
}
}
最终,您会将这些数据保存在某个地方。但是,当添加一个姓氏只能有一个银行账户的规则时,需要对一些数据存储进行查询。假设我们将该逻辑放在存储库中,并且存储库最终返回 Account,我们遇到了Account 不再是 Actor 的问题,因为存储库将无法创建 Actor。
这绝对是一个错误的实现,而不是应该如何使用 Actors。我的问题是,有什么方法可以解决这些问题?我知道我对 Akka 的了解还不够高,所以这可能是一个奇怪/愚蠢的问题。
【问题讨论】:
-
在深入研究参与者位之前,您可能需要查看有关域模型中“集合验证”的文献。例如:codebetter.com/gregyoung/2010/08/12/…
-
嗯,链接好像挂了。
-
谢谢,这太棒了,帮助很大!
-
在actor中创建域模型实际上是错误的方法。当通常情况并非如此时,它会应用一刀切的范式。例如,您可能有一个用户参与者,它允许用户更改他们的个人资料信息,这是一个集群分片参与者,但另一个参与者提供有关用户活动的实时并发数据。在 SO 上 PM 我,也许我可以通过 Skype 电话帮助您。
-
@RobertSimmonsJr.不幸的是,我无法给您发送 PM。我可以通过其他方式联系您吗?
标签: scala akka domain-driven-design