Como un enfoque completamente diferente, puede utilizar el patrón de decorador con sus repositorios.
Decir que tengo
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
Entonces, tendríamos nuestra NHibernateRepository:
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save (EntityType entity)
{
session.SaveOrUpdate(entity);
}
}
entonces podríamos tener un repositorio de Auditoría:
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save (EntityType entity)
{
entity.LastUser = security.CurrentUser;
entity.LastUpdate = DateTime.UtcNow;
innerRepository.Save(entity)
}
}
Luego, utilizando un IoC Framework (StructureMap, Castle Windsor, NInject) puedes construirlo todo sin el resto de tu código sabiendo que estaba auditando.
Por supuesto, cómo auditar los elementos de colecciones en cascada es otra cuestión completamente ...
hay soluciones alternativas a/dar a cada usuario una cuenta de SQL o el uso de autenticación integrada. Puede hacer que se audite una columna "LastUpdatedByUser" en su tabla y enviarla desde la aplicación siempre que actualice un registro. El activador puede usar el valor de esa columna para completar los registros de auditoría. –