Я думаю, вы пытаетесь сделать это неправильно.В соответствии с документацией NHibernate EventListener
s в основном следует рассматривать как одиночные для вашего приложения.
Даже когда вы регистрируете свой пользовательский EventListener
с помощью SessionFactory
, скажем, в началезапрос, у вас все еще нет никакой гарантии, что этот слушатель будет только получать события, созданные в текущем HttpContext
.
Вместо этого вы должны зарегистрировать ваши обработчики событий глобально, при настройке фабрики сеанса.Если вам нужна контекстная информация, такая как принципал, вы можете внедрить зависимость с помощью (http) контекстно-зависимой реализации или реализовать ее как окружающий контекст .
Из пользовательского прослушивателя вы можете получить доступ к сеансу, вызвавшему событие.Возьмем, к примеру, эту ILoadEventListener
реализацию:
public class CustomLoadEventListener : ILoadEventListener
{
private IPrincipalProvider _principalProvider;
public CustomLoadEventListener(IPrincipalProvider provider)
{
_principalProvider = provider;
}
public void OnLoad(LoadEvent @event, LoadType loadType)
{
var sessionThatRaisedTheEvent = @event.Session;
var principalForTheCurrentContext = _principalProvider.GetCurrentPrincipal();
}
}
public interface IPrincipalProvider
{
IPrincipal GetCurrentPrincipal();
}
public class HttpContextPrincipalProvider : IPrincipalProvider
{
public IPrincipal GetCurrentPrincipal()
{
return System.Web.HttpContext.Current.User;
}
}
Возможно, это не тот ответ, который вы надеялись получить, но IMO, о чем вы просите, будет бороться с инфраструктурой, чего я обычно стараюсь избегать.
Если вы опубликуете более подробную информацию о том, чего вы пытаетесь достичь, мы сможем предложить лучшее решение.Что должен делать EventListener