Как совершенно другой подход, вы можете использовать шаблон декоратора с вашими репозиториями.
Скажем, у меня есть
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
Тогда мы имеем нашу NHibernateRepository:
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save (EntityType entity)
{
session.SaveOrUpdate(entity);
}
}
Тогда мы могли бы иметь Ревизионную Repository:
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save (EntityType entity)
{
entity.LastUser = security.CurrentUser;
entity.LastUpdate = DateTime.UtcNow;
innerRepository.Save(entity)
}
}
Затем, используя IoC Framework (StructureMap, Castle Windsor, NInject) вы могли бы создать все это без остальной части вашего кода каждый зная, что вы проводите аудит.
Конечно, как аудит элементов каскадных коллекций другой вопрос полностью ...
Есть обходные/альтернативы давая каждому пользователю учетную запись SQL или с помощью интегрированного AUTH. У вас может быть столбец «LastUpdatedByUser» в вашей проверке и отправке его из приложения при каждом обновлении записи. Триггер может использовать значение этого столбца для заполнения записей аудита. – 2009-04-08 14:18:46