Play/Scala/ReactiveMongo を使用して開発された Web アプリケーションで DB の変更をログに記録するための優れたソリューションを探しています。誰が何を変更したかを知る必要があります。
すべてのデータアクセスとビジネスロジックが発生するサービスという別のレイヤーがあります。すべての保存/更新/削除は特定の方法で行われるため、3 つまたは 4 つの方法で安全にログを記録できますが、ユーザー ID が必要です。
サービスの現在のユーザーにアクセスできません! ユーザーIDを取得できるグローバルなHttpContextやRequestなどはありません(もちろん、ユーザーIDを取得するこの方法は間違っていたと思います)。
私は解決策を持っています:
副作用 (DB の変更) を持つサービスのすべてのメソッドに暗黙的なパラメーターを追加し、それらにユーザー ID を渡します。
def save(model: A)(implicit userIdentity: Option[UserIndentity] = None) = { ... }
デフォルトのリクエストをラップしたので、暗黙のリクエストが暗黙のパラメーターと一致するように UserIdentity トレイトを拡張できます。
class MyRequest[A](...) extends WrappedRequest[A](request) extends UserIdentity
最後に、アクションは次のようなサービスを使用できます。
def index() = MyAction { implicit request =>
//...
defaultService.save(model)
//...
}
悪い点は、これらのサービス メソッドに暗黙的なパラメーターを追加する必要があることです。メソッドのシグネチャを汚染することなく現在のユーザーを取得する別の解決策はありませんか。