質問

現在、ASP.NET人事システムを開発しています。 MVPパターンに基づいたWeb Client Software Factoryで階層化アーキテクチャを使用しています。 ORMはNHibernateです。そして、監査ログモジュールを実装する必要があります。私はさまざまなアプローチについてたくさん読みました。それらのほとんどは、その変更を行った人物の日付、タイムスタンプ、および身元を追跡する方法を説明していますが、そのことについて誰も私に言うことはできません:私のドメイン層のプロパティの変更を追跡する方法は?ロールバック機能は必要ありません。Logのみが必要です。変更されたオブジェクトの誰、いつ、どのプロパティ、そのプロパティの古い値と新しい値。

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

役に立ちましたか?

解決

私はこれを数年前に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;
    }
}

監査が簡単になったのは、各オブジェクトが独自の監査ログを作成できることでした。これらの「フィールド」をx個持つことができるオブジェクトを取得し、GetAuditを呼び出すと、フィールド名、古いval、新しいvalなどを示すクラスへのすべての変更を含む監査オブジェクトが返されます。 「DataField」は、監査オブジェクトを返すメソッドを実装します。文字列、ダブル、整数などについては、かなり焼き付けられていましたが、カスタムオブジェクトを使用する場合は、監査オブジェクトを返すだけでそれらの監査実装を記述できます。

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

フォーム内で何かが変更されたかどうかは、複数のページを経由する必要がある場合でも簡単にわかります。

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

私は長い間コードに触れていないので、正確な詳細が少しぼやけていますが、それがその要点でした。お役に立てば幸いです。

他のヒント

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

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

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

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

編集:データベーストリガーを使用して履歴を記録する2つの部分の例は次のとおりです。 http://www.4guysfromrolla.com/webtech/041807-1.shtml この手法の長所/短所について多くの良い議論があるようです。これがお役に立てば幸いです。

Microsoftのアプリケーションブロックのログをチェックアウトしましたかエンタープライズライブラリ?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top