Какую область действия использовать при использовании экземпляра в отдельном потоке? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть проект WebApi, и в контроллере я использую HostingEnvironment.QueueBackgroundWorkItem для запуска задания в отдельном потоке:

public IHttpActionResult DoJob()
{
    HostingEnvironment.QueueBackgroundWorkItem(ct =>
    {
        var service = new MyService(logService, userInfo);
        var entity = service.DoJob(ct);
    });

    return Ok();
}

В настоящее время в приведенном выше примере я использую конкретный экземпляр (который я хочу заменить) моего сервиса.Я также использую Autofac, и для своих услуг я настроил следующее:

builder.RegisterAssemblyTypes(assemblies)
    .Where(t => t.Name.EndsWith("Service"))
    .AsImplementedInterfaces()
    .InstancePerRequest();

Приведенная выше регистрация работает нормально для всех служб при обычном использовании в запросе.

Будет ли указанная выше регистрациятакже работают для сервисов при запуске в отдельном потоке после завершения запроса?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

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

0 голосов
/ 22 декабря 2018

Будет ли вышеуказанная регистрация работать и для сервисов при запуске в отдельном потоке после завершения запроса?

Да конфигурация для регистрации будет работать.

Какой бы метод вы ни вызывали в своей службе, он может работать или не работать:

Это означает, что если вы попытаетесь разрешить компоненты, которые зарегистрированы как экземплярыза запрос, но нет текущего запроса ... вы получите исключение. .

Либо один из двух следующих случаев является правильным.

Возможно, вы получите автозапускработать иногда, потому что запрос все еще существует, но иногда не будет, потому что запрос заканчивается.

или (наиболее вероятно)

выполнение QueueBackgroundWorkItem()за пределами жизненного диапазона, поэтому он не будет работать вообще.

Таким образом, в конечном счете, ваша служба должна создать свою собственную жизненную область (IDisposable и т. д.).

...