Frage

Ich bin derzeit an der Entwicklung einer ASP.NET Human Resources System.Ich bin mit einem geschichteten Architektur mit Web Client Software Fabrik, die ist basierend auf MVP-Muster.ORM ist NHibernate.Und ich implementieren muss ein Audit-Protokoll Modul.Ich habe viel gelesen über die verschiedenen Ansätze.Die meisten von Ihnen beschreiben, wie verfolgen Sie das Datum, timastamp und die Identität der person, die diese änderung vorgenommen, aber niemand konnte mir sagen, etwa, dass man:so verfolgen Sie änderungen in jede Eigenschaft in meiner Domain-Ebene?Ich brauche keine rollback-Funktion, ich brauche nur die Log mit:wer, Wann, welche Eigenschaft, welches Objekt geändert wurde, Alter Wert und neuer Wert der Eigenschaft.

Ich kann mich nicht entscheiden, wo die handler von diesen änderungen.Fowler deutete ein Audit-Protokoll in der setter-Methode der Eigenschaften, aber ich immer noch wollen, zu halten meine domain-Klassen einfache POCO ist.Vielleicht gibt es eine andere Herangehensweise?

War es hilfreich?

Lösung

Ich hatte dies vor ein paar Jahren für ein HR-system als gut.Ich durchgeführt es mit alle mein 'Felder', implementieren Sie eine Vorlage (generic):

Hier ist ein Beispiel für die Vorlage, die ich gemacht getrimmt:

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

Der interessante Teil über es, dass auditting einfach sind, dass jeder Gegenstand könnte produzieren Sie die eigene audit-Protokoll.Ich könnte jedes Objekt, das hätte x die Anzahl dieser 'Felder' und rufen Sie die GetAudit auf, und es zurückkehren würde mir ein audit-Objekt mit den änderungen an der Klasse zeigt den Namen des Feldes, old val, val neuen etc..Jeder 'DataField' würde implementieren Sie eine Methode aus, um eine audit-Objekt.Für Streicher -, Doppel -, ints usw., es war ziemlich viel gebacken, aber wenn Sie benutzerdefinierte Objekte, die Sie schreiben, könnte der audit-Umsetzung für Sie, die gerade zurück ein Audit-Objekt.

So, in einem typischen form am Ende hätte ich alle gespeicherten Daten in einem Objekt, das hatten alle diese Arten von Feldern.Ich würde dann ein update und rufen Sie die GetAudit Methode, die auch geschrieben werden, um eine audit-Tabelle.

Ich könnte leicht sagen, wenn etwas hatte sich verändert in der form, auch wenn Sie hatte zu gehen durch mehrere Seiten etc.

Rückgängig waren einfach auf ein Feld zu Feld, einen Abschnitt oder das gesamte Objekt-Ebene.

Wenig neblig auf die genauen details, wie ich nicht berührt haben, den code in eine lange Zeit, aber das war der Kern von ihm.Hoffe, das hilft.

Andere Tipps

Vielleicht können Sie implementieren, das observer-Muster, jedoch, da .net implementiert dieses Muster implizit (mit Ereignissen) ich denke, es wird nicht viel Mehrwert.

Vielleicht können Sie das "orginal" objetcs und vergleichen Sie diese mit den geänderten Objekte, wenn die Zeit richtig ist (möglicherweise unter Verwendung der Reflexion) und finden Sie heraus, welche Eigenschaften sich geändert haben und was Ihre neue Wert ist.Beachten Sie jedoch, dass Sie nicht deepcopies von Objekten .Netto (außer wenn Sie die Serialisierung der Objekte), so man im Hinterkopf behalten, für diese Lösung

Entweder Sie benötigen, um die original-Daten um in Ihrem Objekt oder ziehen Sie es aus der Datenbank für die Protokollierung von vor dem update.

Ich habe dies implementiert, in der Daten-Schicht, entweder in gespeicherten Prozeduren oder Triggern, aber nie in den domain layer.

Edit:Ein 2 Teil Beispiel für die Verwendung von Datenbank-Trigger zu melden Geschichte ist hier zu finden: http://www.4guysfromrolla.com/webtech/041807-1.shtml Es scheint viele gute Diskussion über die vor/Nachteile dieser Technik.Ich hoffe, das hilft.

Haben Sie ausgecheckt haben, die Logging Application Block der Microsoft Enterprise-Bibliothek?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top