Веб-задания 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()
.