1

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)
    //...
}

悪い点は、これらのサービス メソッドに暗黙的なパラメーターを追加する必要があることです。メソッドのシグネチャを汚染することなく現在のユーザーを取得する別の解決策はありませんか。

4

1 に答える 1

0

UserIdentity関数に引数として単純に追加することの問題は何ですか? ユーザーが誰であるかを知ることは、ビジネス ロジックにとって重要であるように思われます。結局のところ、今日は誰が操作を実行したかをログに記録し、明日は、この特定のユーザーが操作を許可されていることを確認する必要があります。

そして、私は実際のUserIdentityオブジェクトを使用するだけで、 をハックするのではなく、サービスがインスタンスWrappedRequestをいじる必要はありません。WrappedRequest

于 2014-05-01T15:08:12.780 に答える