アクションを実行しているユーザーなど、コード コンテキスト情報を渡す必要があることがよくあります。このコンテキストは、承認チェックなどのさまざまなことに使用します。このような場合、定型コードを減らすのに暗黙の値が非常に役立つことがわかります。
渡す単純な実行コンテキストがあるとしましょう。case class EC(initiatingUser:User)
便利なガードを使用できます。
def onlyAdmins(f: => T)(implicit context:EC) = context match{
case EC(u) if(u.roles.contain(Role.ADMIN)) => f
case _ => throw new UnauthorizedException("Only admins can perform this action")
}
val result = onlyAdmins{
//do something adminy
}
私は最近、Akka アクターを使用するときにこれを行う必要があることに気付きましたが、彼らはパターン マッチングを利用しており、インプリシットをエクストラクターでうまく機能させる良い方法をまだ見つけていません。
最初に、すべてのコマンドでコンテキストを渡す必要がありますが、それは簡単です:
case class DeleteCommand(entityId:Long)(implicit executionContext:EC)
//note that you need to overwrite unapply to extract that context
しかし、受信関数は次のようになります。
class MyActor extends Actor{
def receive = {
case DeleteCommand(entityId, context) => {
implicit val c = context
sender ! onlyAdmins{
//do something adminy that also uses context
}
}
}
}
抽出された変数を暗黙的としてマークできれば、はるかに簡単になりますが、この機能は見たことがありません:
def receive = {
case DeleteCommand(entityId, implicit context) => sender ! onlyAdmins{
//do something adminy (that also uses context)
}
}
定型コードを減らすために、これをコーディングする別の方法を知っていますか?