Я регистрирую тип, как показано ниже, используя Castle Windsor
container.Register(
Classes.FromAssemblyContaining(typeof(MyApplicationService))
.BasedOn(typeof(IEventSubscriber<>))
.WithService.AllInterfaces()
.LifestyleTransient());
container.Register(
Component.For<IEventHandlerResolver>()
.ImplementedBy<EventHandlerResolver>());
Events.EventHandlerResolver = container.Resolve<IEventHandlerResolver>();
IEventHandlerResolver реализован, как показано ниже
public class EventHandlerResolver : IEventHandlerResolver
{
private readonly IWindsorContainer _windsorContainer;
public EventHandlerResolver(IWindsorContainer windsorContainer)
{
_windsorContainer = windsorContainer;
}
public IEnumerable<IEventSubscriber<T>> ResolveAll<T>() where T : IEvent
{
return _windsorContainer.ResolveAll<IEventSubscriber<T>>();
}
public void ReleaseAll(IEnumerable<object> instances)
{
if (instances == null)
{
throw new ArgumentNullException("instances");
}
foreach (var instance in instances)
{
_windsorContainer.Release(instance);
}
}
}
Это прекрасно работает при вызове события по обычному HTTP-запросу. Однако затем я создаю фоновый поток, используя HostingEnvironment.QueueBackgroundWorkItem
Любой вызов этого типа падает в фоновом потоке с указанием
System.InvalidOperationEception: 'HttpContext.Current is null. PerWebRequestLifestyle can only be used in ASP.Net'
Это происходит именно в этой строке кода:
return _windsorContainer.ResolveAll<IEventSubscriber<T>>();
Я изменил обе регистрации сверху на LifestylePerThread и LifestyleSingleton и LifestyleTransient, но ни одна из них не работает. Что мне не хватает?
Фоновые потоки теряют все регистрации в Виндзоре в том виде, в каком они находятся в текущем потоке? Есть ли рекомендуемый способ работы с ними и Виндзорским замком?