人事システムでも数年前にこれを行う必要がありました。すべての「フィールド」にテンプレート(ジェネリック)を実装させることでそれを達成しました:
以下は、私が作成したテンプレートの例です。
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 メソッドを呼び出します。
複数のページを通過する必要がある場合でも、フォームに何か変更があったかどうかを簡単に知ることができました。
フィールドごと、セクションごと、またはオブジェクト全体のレベルでも、取り消しは非常に簡単でした。
私は長い間コードに触れていないので、正確な詳細については少しぼやけていますが、それがその要点でした. それが役立つことを願っています。