5

アクションを実行しているユーザーなど、コード コンテキスト情報を渡す必要があることがよくあります。このコンテキストは、承認チェックなどのさまざまなことに使用します。このような場合、定型コードを減らすのに暗黙の値が非常に役立つことがわかります。

渡す単純な実行コンテキストがあるとしましょう。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)
  }
}

定型コードを減らすために、これをコーディングする別の方法を知っていますか?

4

2 に答える 2