2012-01-04 2 views
4

Я просмотрел способ регистрации имени пользователя текущего пользователя в таблице сущности ревизии Envers. Тем не менее, информации мало, и информация, которую мне удалось найти, была не такой полезной.Как зарегистрировать текущего пользователя с NHibernate 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 вопрос, связанный с этим, SO question Я понимаю, что при настройке nHibernate можно зарегистрировать имя пользователя при прослушивании.

Однако, это не очень хорошо для меня, так как это будет регистрировать имя пользователя для всех, кто подключается к приложению, для каждой транзакции.

Мне нужно указать имя пользователя, связанное с конкретной транзакцией слушателю.

Раньше я использовал аудит бедных людей, используя прослушиватели событий до и после обновления nHibernate. Здесь I faced a similar problem, поскольку эти слушатели также связаны с заводом, а не с сеансом. Поэтому я переключился на перехватчики старого стиля, которые могут быть связаны с сеансом внутри OpenSession. Это позволило мне добавить текущего пользователя к перехватчику.

Однако, я не знаю, как решить ту же проблему для Envers. Я надеюсь, что кто-то может помочь.

ответ

2

Вы можете использовать свойство Thread.CurrentPrinicpal (MSDN). Механизм членства ASP.NET устанавливает его на идентификатор, связанный с текущим зарегистрированным пользователем

+0

Есть ли разница между 'HttpContext.Current.User' en' Thread.CurrentPrincipal' в моем случае? – Pieter

+0

Я думаю, что нет, но HttpContext.User строго связан с окружением http. Thread.CurrentPrincipal более общий и будет работать с приложением win форм, а также – Novakov

+0

Я думаю, что вы правы, согласно этому сообщению, и поскольку я не изменяю ни одно значение вручную: http://www.hanselman.com/blog/ SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx – Pieter

Смежные вопросы