Autofac область в веб-приложении в таймере - PullRequest
1 голос
/ 11 ноября 2011

Я использую веб-интеграцию autofac, и она прекрасно работает для разрешения компонентов, привязанных к жизни.Но один фрагмент кода вызывается из таймера, и я получаю исключение нулевой ссылки где-то в Autofac.Integration.Web.ContainerProvider.AmbientRequestLifetime.get ().Очевидно, это потому, что в таймере нет HttpContext и время жизни не может быть получено.В соответствии с документацией мне нужно вызвать «container.BeginLifetimeScope» и использовать это время жизни для разрешения моего компонента.Но компонент довольно низкого уровня (сеть, обмен сообщениями), и он не имеет доступа к глобальному объекту asp для доступа к объекту контейнера.Глобальный объект также не имеет доступа к такому низкоуровневому компоненту, чтобы вводить контейнер вручную.Чтобы сделать проблему более сложной, этот компонент может быть вызван из веб-страниц и требует времени жизни веб-запроса, и его нужно вызывать из таймера с вручную созданным временем жизни (или использование IDispose + тоже подойдет).Как мне справиться с ситуацией, когда требуется 2 типа продолжительности жизни?

1 Ответ

2 голосов
/ 11 ноября 2011

Две вещи могут помочь вам начать работу в правильном направлении.

Во-первых, builder.Register(...).InstancePerLifetimeScope() предоставит вам область «для каждого запроса», а также «для каждого пользовательского срока службы».

Во-вторых, если вы запускаете вещи под таймером, создайте новую область действия вручную в точке входа метода таймера, где бы это ни было:

void OnTimer()
{
    using (var timerScope = ApplicationContainer.BeginLifetimeScope())
    {
        var someComponent = timerScope.Resolve(...);
        someComponent.DoWork();
    }
}

Здесь ApplicationContainer - это тот, который вы создали в Global.asax при запуске веб-запроса - вам нужно найти способ справиться с ним, когда отметится таймер.

...