私はIPostUpdateEventListener
インターフェイスを使用して監査ログを更新し、古い値と新しい値を取得してから、更新された各フィールドを「監査」テーブルに格納し、そのすべてをジャイブします。うまく機能しますが、満たすのに苦労している最後の要件が 2 つあります。
- 更新の対象となった従業員を表示します。
- 更新されたフィールドの「わかりやすい」名前を表示します。
#1については、私の最初の本能は、リフレクションを使用して、特定のエンティティの「従業員」プロパティを探して取得し、それがどの従業員向けであるかを見つけることでしたが、グラフの奥深くにいくつかのオブジェクトがあると、すぐに崩壊します指定された Employee オブジェクトに自動的に戻る方法はありません。
#1を解決するためのアイデアは、すべてのオブジェクトに「親」プロパティを必要とすることから、従業員タイプを探してグラフをトラバースできるようにすること(私にとって、単純な永続性の問題のためにドメインを汚染しすぎてしまう)から、別のSQLを使用することまでに及びました。外部キーをトラバースし、事後に従業員 ID を入力するジョブ (これまでのところすべてがコードベースであるため、別の SQL ジョブを維持したくありません。その SQL ジョブは非常に厄介なものになります)。
2 番目の要件については、問題なく変更された実際のプロパティ名を取得できます。フィールドの 80% から 90% では、(適切にフォーマットされた) プロパティ名が表示されるので、Pascal の大文字と小文字に基づいて名前の間隔を空けることができます。ただし、残りのフィールドはさまざまな理由で一致しません。MvcContrib の ASP.NET MVC および Fluent HTML ビルダーを使用していますが、ビュー モデルに、フィールド名がどうあるべきかをオーバーライドする属性を持つように設定を変更したとしても (したがって、ビューのみ)、これらの属性をビュー モデルから保存されているドメイン オブジェクトに一致させる実際の方法はありません。
両方の問題に対する最終的な実用的な解決策は、別のサービスで各更新操作の後に監査ログ サービスを呼び出し、必要に応じてフィールド名と従業員情報を渡すことですが、まあ、私は明らかにそこに行きたくありません。理由。
どちらの問題のアイデアも大歓迎です。2、3 日間頭を悩ませた結果、何の役にも立ちませんでした。ほとんどの人は、古い/新しい vale の単純な録音や、レコード自体の「作成/更新」のタイムスタンプだけにとどまっているようです。