Scala 验证Akka持久性命令的最佳实践
假设我们有一个命令Scala 验证Akka持久性命令的最佳实践,scala,akka,akka-persistence,Scala,Akka,Akka Persistence,假设我们有一个命令AddUser: case class AddUser(username: String, password: String) 在持久化事件之前,验证此命令的最佳方法是什么? 例如,用这样的方式做,看起来有点混乱 override def receiveCommand: Receive = { case AddUser(username, password) => if (username.trim.length > 25) {
AddUser
:
case class AddUser(username: String, password: String)
在持久化事件之前,验证此命令的最佳方法是什么?
例如,用这样的方式做,看起来有点混乱
override def receiveCommand: Receive = {
case AddUser(username, password) =>
if (username.trim.length > 25) {
sender() ! UsernameTooLong
} else if (password.trim.length > 25) {
sender() ! PasswordTooLong
} else {
persist(UserAdded(User(username, password))) {
userAdded =>
sender() ! userAdded
}
}
}
您需要使用接收管道模式: 您可以这样做:
trait AuthenticatedUser { this: ReceivePipeline =>
pipelineInner {
case msg@AddUser(username, password) =>
if (username.trim.length > 25) {
sender() ! UsernameTooLong
} else if (password.trim.length > 25) {
sender() ! PasswordTooLong
} else {
Inner(msg)
}
case msg => Inner(msg)
}
}
class UserActor extends Actor with ReceivePipeline with AuthenticatedUser {
def receive = {
case AddUser(username, password) =>
persist(UserAdded(User(username, password))) {
userAdded =>
sender() ! userAdded
}
}
}
PS:我还没有编译和测试这段代码,但我相信它会工作的,如果有任何问题,请告诉我。是的。这很有效。除此之外,您必须替换
sender()!UsernameTooLong
与内部(UsernameTooLong)
。另外,我猜您可以使用ReceivePipeline
扩展AuthenticatedUser
,然后仅使用AuthenticatedUser
特性扩展UserActor
。非常感谢。:)ReceivePipeline
现在已不推荐使用