2009-06-24 11 views
3

Ich entwickle derzeit ein ASP.NET-Personalwesen-System. Ich verwende eine geschichtete Architektur mit Web Client Software Factory, die auf MVP-Pattern basiert. ORM ist NHibernate. Und ich muss ein Audit-Log-Modul implementieren. Ich habe viel über verschiedene Ansätze gelesen. Die meisten von ihnen beschreiben, wie man Datum, Timestamp und Identität der Person, die diese Änderung vorgenommen hat, nachverfolgt, aber niemand kann mir etwas darüber sagen: Wie kann ich Änderungen an einer Eigenschaft in meiner Domain-Ebene verfolgen? Ich brauche keine Rollback-Fähigkeit, ich brauche nur Log mit: wer, wann und welche Eigenschaft von welchem ​​Objekt wurde verändert, alter Wert und neuer Wert dieser Eigenschaft.Tipp für Audit-Log-Ansatz

Ich kann nicht entscheiden, wo der Handler dieser Änderungen setzen. Fowler hat auf die Methode "Audit Log in Setter" von Eigenschaften hingewiesen, möchte aber trotzdem meine Domänenklassen als einfache POCO's behalten. Vielleicht gibt es einen anderen Ansatz?

+0

Haben Sie schon AOP in Betracht gezogen? – Paco

Antwort

2

Ich musste dies vor ein paar Jahren auch für ein HR-System tun. Ich erreichte es meint alle, die ‚Felder‘ implementieren eine Vorlage (Generika):

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

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 davon, die leicht gemacht auditting war, dass Jedes Objekt könnte sein eigenes Audit-Protokoll erstellen. Ich könnte jedes Objekt nehmen, das eine x-Nummer dieser 'Felder' haben könnte und das GetAudit darauf aufrufen und es würde mir ein Audit-Objekt mit allen Änderungen an der Klasse zurückgeben, die den Feldnamen, altes val, neues val usw. zeigen 'DataField' würde eine Methode implementieren, um ein Überwachungsobjekt zurückzugeben. Für Strings, Double, Ints usw. war es ziemlich oft eingebacken, aber wenn Sie benutzerdefinierte Objekte verwendeten, konnten Sie die Audit-Implementierung für sie schreiben, die nur ein Audit-Objekt zurückgeben mussten.

Also in einer typischen Form am Ende hätte ich alle Daten in einem Objekt gespeichert, das alle diese Arten von Feldern hatte. Ich würde dann ein Update machen und die GetAudit-Methode aufrufen, die auch in eine Audit-Tabelle geschrieben würde.

ich leicht, wenn etwas in der Form geändert hatte sagen konnte, selbst wenn sie auch über mehrere Seiten usw.

Undo Die waren einfach auf einem Feld für Feld, Abschnitt für Abschnitt oder die gesamten Objektebene gehen mußten .

Wenig neblig auf die genauen Details, wie ich den Code seit langer Zeit nicht berührt habe, aber das war der Kern davon. Ich hoffe, das hilft.

0

Vielleicht können Sie das Observer-Muster implementieren, da .net dieses Muster implizit implementiert (mit Ereignissen). Ich denke, dass es keinen großen Mehrwert geben wird.

Vielleicht können Sie die "Original" -Objekte speichern und sie mit den geänderten Objekten vergleichen, wenn die Zeit reif ist (vielleicht mit Reflektion) und herausfinden, welche Eigenschaften sich geändert haben und was ihr neuer Wert ist. Beachten Sie jedoch, dass Sie nicht deepcopies von Objekten in .net machen (außer, wenn die Objekte serialisiert werden können), so dass für diese Lösung im Auge behalten

0

Entweder müssen Sie die Originaldaten in Ihrem Objekt behalten oder vor der Aktualisierung aus der Datenbank zur Protokollierung ziehen.

Ich habe gesehen, dass dies in der Datenschicht implementiert wurde, entweder in gespeicherten Prozeduren oder Triggern, aber niemals in der Domänenebene.

Bearbeiten: Ein 2-teiliges Beispiel für die Verwendung von Datenbank-Trigger zum Protokollieren der Geschichte finden Sie hier: http://www.4guysfromrolla.com/webtech/041807-1.shtml Es scheint zu viele gute Diskussion über die Vor-/Nachteile dieser Technik. Ich hoffe das hilft.

+0

OK, vielleicht möchte ich zu viel, aber könnten Sie einen Code oder ein Diagramm teilen, die einen solchen Ansatz entweder in der Datenschicht oder der Dienstschicht veranschaulichen ... Ich kann mir solch ein Prüfsystem einfach nicht vorstellen ... – Alkersan