Question

Je développe actuellement un système de ressources humaines ASP.NET. J'utilise une architecture en couches avec Web Client Software Factory, qui repose sur un modèle MVP. ORM est NHibernate. Et je dois implémenter un module de journal d'audit. J'ai beaucoup lu sur les différentes approches. La plupart d'entre eux décrivent comment suivre la date, l'horodatage et l'identité de la personne qui a effectué ce changement, mais personne ne peut me le dire: comment suivre les changements d'une propriété dans ma couche de domaine? Je n'ai besoin d'aucune fonctionnalité d'annulation, je n'ai besoin que de vous connecter avec: qui, quand et quelle propriété de quel objet a été modifié, ancienne valeur et nouvelle valeur de cette propriété.

Je ne peux pas décider où mettre le gestionnaire de ces modifications. Fowler a indiqué une méthode de propriétés du journal d’audit dans le journal d’audit, mais je veux toujours garder mes classes de domaine simples POCO. Peut-être qu’il existe une autre approche?

Était-ce utile?

La solution

Je devais le faire il y a quelques années pour un système de ressources humaines également. Je l’ai accompli en ayant tous mes 'champs' implémentés un template (générique):

Voici un exemple de modèle que j'ai créé coupé:

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

Ce qui a rendu l’audit facile, c’est que chaque objet pouvait produire son propre journal d’audit. Je pouvais prendre n'importe quel objet pouvant contenir un nombre x de ces "champs" et appeler GetAudit dessus. Un objet d'audit contenant tous les changements apportés à la classe et indiquant le nom du champ, l'ancien val, le nouveau val, etc. 'DataField' implémenterait une méthode pour renvoyer un objet d'audit. Pour les chaînes, double, ints, etc., c’est à peu près cuit, mais si vous utilisez des objets personnalisés, vous pouvez écrire l’implémentation d’audit pour ceux-ci qui doivent simplement renvoyer un objet Audit.

Donc, dans un formulaire typique à la fin, toutes les données seraient stockées dans un objet contenant tous ces types de champs. Je ferais ensuite une mise à jour et appellerais la méthode GetAudit, qui serait également écrite dans une table d'audit.

Je pouvais facilement savoir si quelque chose avait changé dans le formulaire même s’ils devaient parcourir plusieurs pages, etc.

Les annulations étaient vraiment faciles sur un champ par champ, section par section ou le niveau entier de l'objet.

Un peu de brouillard sur les détails exacts car je n’ai pas touché au code depuis longtemps mais c’est l’essentiel. J'espère que ça aide.

Autres conseils

Peut-être que vous pouvez implémenter le modèle d'observateur, cependant, puisque .net implémente implicitement ce modèle (avec des événements), je pense qu'il n'y aura pas beaucoup de valeur ajoutée.

Peut-être pouvez-vous enregistrer le " orginal " objets et comparez-les avec les objets modifiés lorsque le temps le permet (peut-être en utilisant la réflexion) et découvrez quelles propriétés ont été modifiées et quelle est leur nouvelle valeur. Toutefois, notez que vous ne pouvez pas créer d’archives profondes d’objets dans .net (sauf si vous pouvez sérialiser les objets), n’oubliez donc pas cette solution

Vous devez soit conserver les données d'origine dans votre objet, soit les extraire de la base de données pour les enregistrer avant la mise à jour.

Je l'ai vu implémenté dans la couche de données, dans des procédures stockées ou des déclencheurs, mais jamais dans la couche de domaine.

Modifier: un exemple en deux parties d'utilisation de déclencheurs de base de données pour consigner l'historique se trouve ici: http://www.4guysfromrolla.com/webtech/041807-1.shtml Il semble y avoir beaucoup de bonnes discussions sur les avantages / inconvénients de cette technique. J'espère que ça aide.

Avez-vous vérifié le Bloc d'application de journalisation de Microsoft Bibliothèque d'entreprise?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top