Я посмотрел, как записать имя пользователя текущего пользователя в таблицу сущностей ревизий Envers. Однако информации мало, и информация, которую мне удалось найти, оказалась не очень полезной.
У меня есть ревизионная сущность и слушатель, который выглядит так:
[RevisionEntity(typeof(EnversRevisionListener))]
public class EnversRevisionEntity : DefaultRevisionEntity
{
public virtual string UserName { get; set; }
}
public class EnversRevisionListener : IRevisionListener
{
private string _userName = "unknown";
public EnversRevisionListener(string userName)
: base()
{
_userName = userName;
}
public void NewRevision(object revisionEntity)
{
var casted = revisionEntity as EnversRevisionEntity;
if (casted != null)
{
casted.UserName = _userName;
}
}
}
Я хочу использовать эти два в среде ASP.NET. Конфигурация и фабрика сеансов создаются один раз, поскольку это дорогостоящее действие. Для каждой транзакции открывается новый сеанс.
Из этой проблемы NHE Jira и связанной с ней ТАК вопрос Я понимаю, что при настройке nHibernate можно зарегистрировать имя пользователя в прослушивателе.
Однако для меня этого недостаточно, поскольку при этом регистрируется имя пользователя, который подключается к приложению первым для каждой транзакции.
Мне нужно предоставить слушателю имя пользователя, связанное с конкретной транзакцией.
Раньше я использовал аудит бедняков, используя прослушиватели событий до и после обновления nHibernate. Здесь Я столкнулся с аналогичной проблемой , так как эти слушатели также связаны с фабрикой сеансов, а не с сеансом. Поэтому я переключился на перехватчики старого стиля, которые могут быть связаны с сеансом внутри OpenSession
. Это позволило мне добавить текущего пользователя к перехватчику.
Однако я не знаю, как решить ту же проблему с Энверсом. Я надеюсь, что кто-то может помочь.