Pregunta

Actualmente estoy desarrollando un Sistema de Recursos Humanos ASP.NET. Estoy usando una arquitectura en capas con Web Client Software Factory, que se basa en el patrón MVP. ORM es NHibernate. Y necesito implementar un módulo de registro de auditoría. He leído mucho sobre diferentes enfoques. La mayoría de ellos describen cómo rastrear la fecha, la marca de fecha y la identidad de la persona que realizó ese cambio, pero nadie podría decirme sobre eso: ¿cómo rastrear los cambios de cualquier propiedad en mi capa de Dominio? No necesito ninguna capacidad de reversión, solo necesito iniciar sesión con: quién, cuándo y qué propiedad de qué objeto se cambió, el valor anterior y el nuevo valor de esa propiedad.

No puedo decidir dónde colocar el controlador de estos cambios. Fowler señaló un registro de auditoría en el método de establecimiento de propiedades, pero todavía quiero mantener mis clases de dominio simples POCO`s. ¿Quizás hay algún otro enfoque?

¿Fue útil?

Solución

Tuve que hacer esto hace unos años para un sistema de recursos humanos también. Lo logré haciendo que todos mis 'campos' implementen una plantilla (genérica):

Aquí hay un ejemplo de la plantilla que hice recortada:

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 interesante al respecto que facilitó la auditoría fue que cada objeto podía producir su propio registro de auditoría. Podría tomar cualquier objeto que pudiera tener x número de estos 'campos' y llamar a GetAudit y me devolvería un objeto de auditoría con todos los cambios en la clase que muestra el nombre del campo, el valor antiguo, el valor nuevo, etc. Cada 'DataField' implementaría un método para devolver un objeto de auditoría. Para cadenas, dobles, ints, etc., estaba prácticamente integrado, pero si usaba objetos personalizados, podría escribir la implementación de auditoría para ellos que solo tenía que devolver un objeto de Auditoría.

Entonces, en una forma típica al final, tendría todos los datos almacenados en un objeto que tuviera todos estos tipos de campos. Luego haría una actualización y llamaría al método GetAudit, que también se escribiría en una tabla de auditoría.

Podría decir fácilmente si algo había cambiado en el formulario, incluso si tenían que pasar por varias páginas, etc.

Deshacer fue realmente fácil en un campo por campo, sección por sección o el nivel de objeto completo también.

Poco brumoso en los detalles exactos ya que no he tocado el código en mucho tiempo, pero eso era lo esencial. Espero que ayude.

Otros consejos

Sin embargo, quizás pueda implementar el patrón de observador, ya que .net implementa este patrón implícitamente (con eventos), creo que no habrá mucho valor agregado.

Quizás pueda guardar el "original" objetcs y compárelos con los objetos modificados cuando sea el momento adecuado (quizás usando la reflexión) y descubra qué propiedades han cambiado y cuál es su nuevo valor. Sin embargo, tenga en cuenta que no puede hacer copias en profundidad de los objetos en .net (excepto si puede serializar los objetos), así que tenga esto en cuenta para esta solución

O necesita mantener los datos originales en su objeto o extraerlos de la base de datos para iniciar sesión antes de la actualización.

He visto esto implementado en la capa de datos, ya sea en procedimientos almacenados o disparadores, pero nunca en la capa de dominio.

Editar: Aquí se encuentra un ejemplo de 2 partes del uso de disparadores de bases de datos para registrar el historial: http://www.4guysfromrolla.com/webtech/041807-1.shtml Parece haber mucha discusión sobre los pros / contras de esta técnica. Espero que eso ayude.

¿Ha comprobado el Bloqueo de aplicaciones de registro de Microsoft Biblioteca empresarial?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top