Domanda

Attualmente sto sviluppando un sistema di risorse umane ASP.NET. Sto usando un'architettura a strati con Web Client Software Factory, che si basa sul modello MVP. ORM è NHibernate. E devo implementare un modulo Log di audit. Ho letto molto su diversi approcci. Molti di loro descrivono come tenere traccia della data, del timastamp e dell'identità della persona che ha apportato tale modifica, ma nessuno potrebbe parlarmi di quello: come tenere traccia delle modifiche di qualsiasi proprietà nel mio livello Dominio? Non ho bisogno di alcuna funzionalità di rollback, ho solo bisogno di accedere con: chi, quando e quale proprietà di quale oggetto è stato modificato, vecchio valore e nuovo valore di quella proprietà.

Non riesco a decidere dove inserire il gestore di queste modifiche. Fowler ha indicato un registro di controllo nel metodo delle proprietà setter, ma voglio ancora mantenere le mie classi di domini semplici POCO`s. Forse c'è qualche altro approccio?

È stato utile?

Soluzione

Ho dovuto farlo qualche anno fa anche per un sistema HR. L'ho realizzato avendo tutti i miei "campi" implementare un modello (generico):

Ecco un esempio del modello che ho creato ritagliato:

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

La parte interessante che ha reso facile l'auditing è stata che ogni oggetto poteva produrre il proprio registro di controllo. Potrei prendere qualsiasi oggetto che potrebbe avere un numero x di questi 'campi' e chiamare GetAudit su di esso e mi restituirebbe un oggetto di controllo con tutte le modifiche alla classe che mostra il nome del campo, la vecchia val, la nuova val ecc. Ciascuno 'DataField' implementerebbe un metodo per restituire un oggetto di controllo. Per stringhe, double, ints ecc. Era praticamente integrato, ma se hai usato oggetti personalizzati potresti scrivere l'implementazione di audit per loro che doveva solo restituire un oggetto Audit.

Quindi in una forma tipica alla fine avrei tutti i dati memorizzati in un oggetto che aveva tutti questi tipi di campi. Vorrei quindi fare un aggiornamento e chiamare il metodo GetAudit che verrebbe anche scritto in una tabella di controllo.

Potrei facilmente dire se qualcosa è cambiato nel modulo anche se hanno dovuto passare attraverso più pagine ecc.

Gli annullamenti sono stati davvero facili su un campo per campo, sezione per sezione o sull'intero livello dell'oggetto.

Un po 'annebbiato sui dettagli esatti dato che non ho toccato il codice da molto tempo, ma quello era il senso. Spero che sia d'aiuto.

Altri suggerimenti

Forse puoi implementare il modello di osservatore, tuttavia, poiché .net implementa questo modello implicitamente (con eventi) penso che non ci sarà molto valore aggiunto.

Forse puoi salvare il " originale " objetcs e confrontarli con gli oggetti modificati quando è il momento (magari usando la riflessione) e scoprire quali proprietà sono cambiate e qual è il loro nuovo valore. Tuttavia, tieni presente che non puoi creare copie di oggetti in deepnet .net (tranne se puoi serializzare gli oggetti), quindi tienilo a mente per questa soluzione

O è necessario conservare i dati originali nell'oggetto o estrarli dal database per la registrazione prima dell'aggiornamento.

L'ho visto implementato nel livello dati, sia nelle procedure memorizzate che nei trigger, ma mai nel livello dominio.

Modifica: un esempio in 2 parti dell'utilizzo dei trigger del database per la cronologia dei registri è disponibile qui: http://www.4guysfromrolla.com/webtech/041807-1.shtml Sembra che ci siano molte buone discussioni sui pro / contro di questa tecnica. Spero che sia d'aiuto.

Hai verificato il Logging Application Block di Microsoft Enterprise Library?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top