2009-08-27 7 views
4

私は、オブジェクトに対して行われたすべての変更を追跡する良い方法を探しています。asp.net mvc(nhibernate)のオブジェクトの変更をどのように追跡すればよいですか?

私たちはカスタムフレームワークを構築しており、誰がいつどのようなオブジェクトを変更したかについての履歴(種類)を持つ必要があります。

この場合、どのような良い方法がありますか?

保存/更新メソッドを拡張して「ログ」を作成しますか? log4netや種類のロギング拡張機能を試してください。

私は、セーブ/アップデート/ルーチンを拡張する際のオーバーヘッドが心配です。

編集: はい、私は顧客が時々失われたデータに文句を言う、月の少なくとも変更を確認する必要があり、彼らはそれを削除したことを「忘れて」...

EDIT2(より良く理解するために、questonsは尋ねましたコメントは次のようになります。 履歴はdb(ms sql)に保存する必要があり、すべてのクラスのすべてのアクションにログを追加したくありません。すべてのクラスは、保存、ロード、更新、削除などを提供する私のベースクラスから継承されています... さらなる回答/コメントありがとう:)

答えて

0

私はデータストアとしてリレーショナルデータベースを使用していると仮定します。

元のエンティティとほぼ同じテーブルスキーマを持つ履歴テーブルをデータベースに追加する必要があります。

このテーブルの各行は、元の(ライブ)エンティティへの外部キーとタイムスタンプを取得するので、変更が完了した順序になります。後で、テーブルからorignialIDですべての履歴情報を取得し、タイムスタンプでソートしてから、変更に基づいてカスタムログメッセージを作成することができます(リフレクションと見なしてください)。

あなたはしかし、あなたの変更の追跡は、あなたがhistorテーブルに元の行をコピーして、すべてのアップデートで

(関係などの変更を追跡)オブジェクトグラフをトラバース元を参照する必要がありますどのように「深い」を決定する必要があります

元の行を更新する前に、タイムスタンプを追加してください。

これをカプセル化するために、ストアドプロシージャを使用して更新を行うことができます。

+0

はい私はリレーショナルデータベースを使用しています(今のところSQL Server 2005)。リレーションを追跡することも必要になります(たとえば、ユーザーyからxに追加された商品説明)。 – griti

0

どのくらいの期間の履歴が必要ですか?答えがアプリケーションインスタンスよりも長い場合は、データベースルートをダウンする必要があります。そのような場合は、コードではなくdbレベルですべて処理します。おそらく、トリガーは、ここにあなたの友人...

+0

良い点、履歴のエントリやものを復元するための使いやすさについてさらに確認します。データベースレベルでは、すべてのオブジェクトの履歴を作成する必要があります。オブジェクトごとに3つ以上のテーブルが必要になる場合があります。uff <: – griti

+0

これまでのところ、顧客のニーズをチェックしただけで、履歴はnHibernate 。トリガーとnHibernateを使用すると解決策になりますが、私の場合はそうではありません。 – griti

0

あなたは、リレーショナルデータベースを使用していると仮定するために興味深いかもしれありますが、単純にコードが挿入、更新にトリガ可能性があり、イベントを削除します。他のテーブル内にアクションなどを書くことができます。

元のデータテーブルと同じ定義の履歴テーブルを使用することも考えてください。これにより、元のテーブルをできるだけ軽量に保つことができます。これによりデータベース内のテーブルへのDQLのパフォーマンスが向上し、誤って削除されたレコードにDeleteイベントをトレースする際にすべてのレコードを取得する必要はありませんユーザーによって。

別の方法として、毎日処理される行の数に応じて、フィールドが削除されているかどうかをtrueまたはfalseにフラグを立てて、現在のアクションを保存する列を追加するだけです。 Active Directoryで動作するようにDBを構成したと仮定して、現在のユーザーを正確に識別できるようにします。

私が書いている間、私は別のアイデアを取り上げました。あなたはおそらくすでにそれについて自分自身を考えました! :-)とにかく、セキュリティ問題を管理するDLLを構築します。あなたのコードの中で、セキュリティDLLを使って識別された現在ログに記録されているユーザのパラメータを単純に渡すことができます。

それでも、log4netはそれを行う良い方法だと思います。おそらく、すべてのユーザーのイベントを個人用エディションの無料DBであるSQLite DBに記録することができます。 Microsoft Enterprise Library 4.1 - 2008年10月、私が正しく覚えていれば、非常に便利なツールを提供しています。プログラマとして、やり直してやり直す必要があるものは、急速に退屈になります。 MELは特に、これらの繰り返し可能なルーチンを繰り返し書き直す苦労を避けるために設計されています。これにより、クライアントにとって重要なもの、機能、および要件に集中することができます。 OpenSourceであり、IBM、HPなどの大企業の要求に応じてMicrosoftによって管理されています。私たちはまだその存在を無視しているかもしれない。とにかく、私はエンタープライズライブラリが、コンフィギュレーションだけでほとんど機能するので、常にあなたのアーキテクチャを検討する最善の方法かもしれないと思います。

リフレクションに慣れている場合は、リフレクションと保存中に同時にログを記録するルーチンを使用して、オブジェクトのインスタンスを初期化することもできます。

ご覧のとおり、多くの努力なしに可能にする方法はたくさんあります。それはあなたのアーキテクチャに依存します。

さて、私はたくさん書いたことがあります。私は誰にも負けないことを願っています! :-)

素敵な一日を!

+0

トリガーは、それを行うための一つの方法ですが、それをロードするためにnhibernateですべてをマップする必要があります( "正しい"方法)。 もちろん、リフレクションで柔軟性があるので、追跡/ロギング全体について考えて、顧客が何を望んでいるか/確かめるかどうかを確認してください;) – griti

+0

また、アプリケーションレベルでロギング/トリガーインしたいと思います。私のコメントに言及してください:-) – griti

+0

私はエンタープライズライブラリのロギング機能について知っています。主に、Enterprise Libraryは、正しく動作するためには構成のみを必要とします。私はこれが探検する興味深い方法かもしれないと思う。 –

2

あなたは基本的に監査ソリューションを探していますか?私はHibernateがHibernate Enversと呼ばれるアドオンプロジェクトを使ってHibernateにその機能を持っていることを知っています。私がこれで見つけることができる最も速いものはthis blog postです。 NHibernateについては、NHibernateにEnversを移植し、.NETコミュニティにこの機能を活用する作業が行われていると思います。

別の解決策に入る前に、ETAが何であるかを知ることは価値があると思います。 ORMに組み込むことができればそれはいいですよね? ;-)

すぐに確認したところ、少なくとも彼のtwitterフィードによれば、Tuna Toksozはそれに取り組んでいると思います。

+0

私の問題が深くなるにつれて、監査ログが必要なように見えます。はい。 Enversサウンドは本当にいいですし、柔軟性も完璧に見えます。しかし、私は.Netポートに関する深刻な情報を見つけることができませんでした、Tuna Toksozにはブログ投稿がありません...私も読む(http://nhforge.org/wikis/howtonh/creating-an-audit-log-using -nhibernate-events.aspx)これは自分で行うことができる方法のようです。 – griti

+0

@Erik van Brakelのおかげで、ロギングを手動で設定する作業のヒープが節約されました! – Rowan

関連する問題