В качестве совершенно другого подхода вы можете использовать шаблон декоратора со своими репозиториями.
Скажи, что у меня
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);
}
}
Тогда у нас может быть Репозитарий аудита:
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), вы можете собрать все это без остатка кода, зная, что у вас идет аудит.
Конечно, то, как вы проверяете элементы каскадных коллекций, является еще одной проблемой ...