2009-06-24 22 views
3

私は現在、ASP.NET Human Resources Systemを開発中です。 MVPパターンに基づいたWeb Client Software Factoryで階層化されたアーキテクチャを使用しています。 ORMはNHibernateです。監査ログモジュールを実装する必要があります。私はさまざまなアプローチについてたくさん読んできました。それらのほとんどは、その変更を行った人物の日付、タイムスタンプ、アイデンティティを追跡する方法を記述していますが、そのことについて誰も私に教えてくれる人はいません。ロールバック機能は必要ありません。誰にいつ、どのオブジェクトのどのプロパティが変更されたのか、そのプロパティの古い値と新しい値だけでログが必要です。監査ログへのヒントのヒント

私はこの変更のハンドラをどこに置くか決定できません。ファウラーはプロパティのセッターメソッドで監査ログを指摘しましたが、私はまだ私のドメインクラスを単純なPOCO`sにしておきたいと思います。たぶん、他のアプローチがありますか?

+0

すでにAOPを検討しましたか? – Paco

答えて

2

これは、HRシステムの場合でも数年前に行う必要がありました。ここで

は私がダウンしてトリミング作られたテンプレートの例である:

class DataField<T> 
{ 
    public T Current { get; set; } 
    public T Original { get; set; } 
    // stores the field name as a nice textual readable representation. 
    // would default to property name if not defined. 
    public string FieldName { get; set; } 
    public bool Modified 
    { 
     get { return !(Current.Equals(Original)); 
    } 

    public DataField(T value) 
    { 
     Original = Current = value; 
    } 

    public DataField(T value, T fieldName) 
    { 
     Original = Current = value; 
     FieldName = fieldName; 
    } 
} 

簡単auditting作られ、それについての興味深い部分があることだった私はそれがすべての私の「フィールド」は、テンプレート(ジェネリック)を実装した達成しました各オブジェクトは独自の監査ログを生成できます。私はこれらのフィールドのx番号を持つ可能性のあるオブジェクトを取ることができ、GetAuditを呼び出すと、フィールド名、古いval、新しいvalなどを示すクラスに対するすべての変更を含む監査オブジェクトが返されます。 'DataField'は、監査オブジェクトを返すメソッドを実装します。文字列、倍精度、intsなどの場合、それはかなり焼き付けられましたが、カスタムオブジェクトを使用した場合、Auditオブジェクトを返すだけの監査実装を記述することができます。

最終的に典型的なフォームでは、これらすべてのタイプのフィールドを持つ1つのオブジェクトにすべてのデータが格納されます。私はその後、更新を行い、監査テーブルにも書き込まれるGetAuditメソッドを呼び出します。何が彼らは複数のページを経由しなければならなかった場合でも形に変わっていた場合、私は簡単に言うことができる

など

は、元に戻すのにもフィールド、セクションごとにまたは全体のオブジェクトレベルでフィールド上で本当に簡単でした。

私は長い間コードに触れていませんでしたが、それはその要点でした。希望が役立ちます。

0

おそらく、.netはこのパターンを暗黙的に(イベントとともに)実装しているので、あまり価値がないと思うので、オブザーバーパターンを実装することができます。

"オリジナル"オブジェクトを保存して、時間が正しいとき(おそらくリフレクションを使用して)変更されたオブジェクトと比較して、変更されたプロパティと新しい値がわかるかもしれません。 ただし、オブジェクトのシリアル化を行うことはできません(オブジェクトをシリアル化できる場合を除いて).netでオブジェクトのディープコピーを作成できないことに注意してください。

0

元のデータをオブジェクトに保存するか、または更新前にログに記録するためにデータベースから取得する必要があります。

これは、ストアドプロシージャまたはトリガのいずれかでデータレイヤに実装されていますが、ドメインレイヤでは実装されていません。

編集:データベースのトリガーを使用して履歴を記録する2つの例は、ここにあります:http://www.4guysfromrolla.com/webtech/041807-1.shtmlこの手法の長所と短所については、多くの面白い議論のようです。私はそれが助けて欲しい

+0

OK、あまりにも欲しいかもしれませんが、データレイヤーやサービスレイヤーのようなアプローチを示すいくつかのコードやダイアグラムを共有できますか...私はそのような監査システムを想像できません... – Alkersan