Autofac и Azure WebJobs - PullRequest
       9

Autofac и Azure WebJobs

0 голосов
/ 03 мая 2018

Наше приложение активно использует зависимости от запросов по запросу. Это работает довольно хорошо и соответствует нашим потребностям.

Теперь у нас есть требование прослушивать AzureWebJobs.

Поскольку я довольно новичок в веб-заданиях Azure, я следовал этому учебнику (здесь git-sources )

Теперь сложная часть.
Несмотря на то, что я выполнил все инструкции и создал AutofacActivator Autofac, похоже, не может разрешить мои зарегистрированные зависимости для каждого запроса

DependencyResolutionException: нет области с совпадением тега AutofacWebRequest виден из области, в которой экземпляр был запрошен. Это обычно означает, что компонент зарегистрирован поскольку запрос по HTTP запрашивается функцией SingleInstance () компонент (или аналогичный сценарий). При веб-интеграции всегда запросить зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда из контейнера сам по себе.

Вопрос

Можно ли как-то в соответствии с вышеуказанными требованиями заставить Autofac работать вместе с Azure-WebJobs?

Чтобы быть понятным, мой Автофактум разрешает только одну службу. Это нельзя зарегистрировать как SingleInstance, поскольку оно разрешается и в других службах. Кроме того, я не могу изменить свой Per-Request-Stuff на InstancePerLifetimeScope, как предложено здесь

Я надеюсь, что моя проблема и мой вопрос говорят сами за себя. Если нет, пожалуйста, дайте мне знать

1 Ответ

0 голосов
/ 04 мая 2018

Веб-задания Azure не являются веб-приложениями, они больше похожи на консольные приложения. У них нет семантики запроса / ответа. У них нет ни http-контекста сеанса, ни области запроса. Поэтому вам не следует использовать регистрации по запросу, они бессмысленны внутри веб-задания. Если вы настаиваете на использовании зависимостей для каждого запроса, вам придется смоделировать контекст запроса для вашего веб-задания, и это рискованный подход. Вы можете легко ввести утечки памяти и нежелательные побочные эффекты. Имейте в виду, что вы используете неестественный способ работы с областями зависимости в веб-заданиях. Для получения дополнительной информации см. на этой странице о реализации пользовательских областей под запрос .

Простой способ справиться с этим - получить область зависимостей только на время жизни ваших методов-обработчиков событий. Вы явно определяете свою область внутри блока using (поскольку области не будут автоматически создаваться в веб-задании так, как они автоматически создаются в приложении MVC или ASP.NET). Вы должны зарегистрировать свои типы как .InstancePerLifetimeScope(). Экземпляры будут удалены при выходе из блока using.

Таким образом, в ваших обработчиках событий вы определяете область жизни для каждого выполнения метода обработчика:

private void OnEvent(...)
{
    using (var scope = container.BeginLifetimeScope())
    {
        ...
        var myService = scope.Resolve<IMyService>();
        ...
    }
}

В этом примере используются явные вызовы Resolve для получения экземпляров вашего сервиса. Есть более эффективные способы сделать это, например, использовать фабричные методы autofac.

Более совершенным решением было бы реализовать собственный IJobActivator. Таким образом, вы можете использовать инъекцию конструктора в ваш класс Functions, и область действия этих экземпляров будет временем жизни выполнения вашего метода-обработчика. Этот ответ содержит примеры кода. Вам все равно нужно будет зарегистрировать ваши типы как .InstancePerLifetimeScope().

...