3

私は現在、ASP.NET人事システムを開発しています。MVPパターンに基づくWebクライアントソフトウェアファクトリーで階層化アーキテクチャを使用しています。ORMはNHibernateです。そして、監査ログモジュールを実装する必要があります。私はさまざまなアプローチについてたくさん読みました。それらのほとんどは、その変更を行った人の日付、タイミング、およびIDを追跡する方法を説明していますが、そのことについては誰も教えてくれませんでした。ドメインレイヤーのプロパティの変更を追跡する方法は?ロールバック機能は必要ありません。必要なのはLogwith:who、when、whatプロパティのどのオブジェクトが変更されたか、そのプロパティの古い値と新しい値だけです。

この変更のハンドラーをどこに置くかを決めることができません。Fowlerは、プロパティのsetterメソッドでAudit Logを指摘しましたが、それでもドメインクラスを単純なPOCOのままにしておきたいと思います。多分他のアプローチがありますか?

4

4 に答える 4

2

人事システムでも数年前にこれを行う必要がありました。すべての「フィールド」にテンプレート(ジェネリック)を実装させることでそれを達成しました:

以下は、私が作成したテンプレートの例です。

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;
    }
}

監査を容易にした興味深い部分は、各オブジェクトが独自の監査ログを生成できることです。これらの「フィールド」を x 個持つ可能性のある任意のオブジェクトを取得して GetAudit を呼び出すと、フィールド名、古い val、新しい val などを示すクラスへのすべての変更を含む監査オブジェクトが返されます。 「DataField」は、監査オブジェクトを返すメソッドを実装します。文字列、倍精度、int などの場合はほとんど組み込まれていますが、カスタム オブジェクトを使用する場合は、Audit オブジェクトを返す必要があるだけの監査実装を作成できます。

したがって、最後の典型的な形式では、これらすべてのタイプのフィールドを持つ 1 つのオブジェクトにすべてのデータを格納します。次に更新を行い、監査テーブルにも書き込まれる GetAudit メソッドを呼び出します。

複数のページを通過する必要がある場合でも、フォームに何か変更があったかどうかを簡単に知ることができました。

フィールドごと、セクションごと、またはオブジェクト全体のレベルでも、取り消しは非常に簡単でした。

私は長い間コードに触れていないので、正確な詳細については少しぼやけていますが、それがその要点でした. それが役立つことを願っています。

于 2009-06-26T01:40:19.170 に答える
0

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

おそらく、「元の」オブジェクトなどを保存し、適切なタイミングで (おそらくリフレクションを使用して) 変更されたオブジェクトと比較し、変更されたプロパティとその新しい値を調べることができます。ただし、.net ではオブジェクトのディープコピーを作成できないことに注意してください (オブジェクトをシリアル化できる場合を除く)。

于 2009-06-24T20:12:28.667 に答える
0

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

これがストアド プロシージャまたはトリガーのデータ層に実装されているのを見たことがありますが、ドメイン層には実装されていません。

編集: データベース トリガーを使用して履歴をログに記録する 2 つの部分の例がここにあります: http://www.4guysfromrolla.com/webtech/041807-1.shtml それが役立つことを願っています。

于 2009-06-24T20:28:32.813 に答える
-1

Microsoft Enterprise Library のLogging Application Blockを確認しましたか?

于 2009-06-24T20:20:34.140 に答える