Проблема Виндзорского замка при запуске фонового потока с QueueBackgroundWorkItem - PullRequest
0 голосов
/ 06 апреля 2019

Я регистрирую тип, как показано ниже, используя 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, но ни одна из них не работает. Что мне не хватает?

Фоновые потоки теряют все регистрации в Виндзоре в том виде, в каком они находятся в текущем потоке? Есть ли рекомендуемый способ работы с ними и Виндзорским замком?

1 Ответ

0 голосов
/ 07 апреля 2019

У вас есть зависимость LifestylePerWebRequest() в одном из ваших IEventSubscriber с. Проверьте трассировку полного стека, если вы не уверены, какой именно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...