c# - Autofac 和 Azure WebJobs

标签 c# azure autofac azure-webjobs

我们的应用程序大量使用 Autofac 每个请求依赖项。 这工作得很好并且符合我们的需求。

现在我们需要监听 AzureWebJobs。

由于我对 Azure WebJobs 还很陌生,所以我关注了 this教程(这里是 git-sources )

现在是棘手的部分。
尽管我遵循了所有说明并创建了 AutofacActivator Autofac 似乎无法解析我的按请求注册的依赖项

DependencyResolutionException: No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.

问题

有什么办法可以根据上述要求使 Autofac 与 Azure-WebJobs 一起工作吗?

需要明确的是,我的 Autofaclistener 仅解析一项服务。这不能注册为 SingleInstance,因为它也在其他服务上得到解决。另外,我无法将我的 Per-Request-Stuff 更改为 InstancePerLifetimeScope按照建议here

我希望我的问题和问题是不言自明的。如果没有,请告诉我

最佳答案

Azure webjobs 不是 Web 应用程序,它们更像是控制台应用程序。它们没有请求/响应语义。它们没有 http session 上下文,也没有请求范围。因此,您不应该使用按请求注册,它们在网络作业中毫无意义。如果您坚持使用每个请求的依赖关系,您将必须为您的网络作业模拟请求上下文,这是一种有风险的方法。您很容易引入内存泄漏和不良副作用。请注意,您正在强制采用一种不自然的方式来处理网络作业中的依赖范围。请参阅this page about implementing custom per-request scopes了解更多信息。

处理此问题的一个简单方法是仅在事件处理程序方法的生命周期内获取依赖范围。您可以在 using block 内显式定义您的作用域(因为作用域不会像在 MVC 或 ASP.NET 应用程序中自动创建那样在 Webjob 中自动创建)。您必须将类型注册为 .InstancePerLifetimeScope()。当您退出 using block 时,这些实例将被释放。

因此,在事件处理程序中,您可以为处理程序方法的每次执行定义生命周期范围:

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

此示例使用显式 Resolve 调用来获取服务的实例。有更好的方法可以做到这一点,例如使用 autofac 工厂方法。

更高级的解决方案是实现您自己的IJobActivator。这样,您就可以在 Functions 类中使用构造函数注入(inject),并且这些实例的生命周期范围将是处理程序方法执行的生命周期。 This answer包含代码示例。不过,您仍然需要将类型注册为 .InstancePerLifetimeScope()

关于c# - Autofac 和 Azure WebJobs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148200/

相关文章:

azure - 使用 Azure 逻辑应用列出和查看 Azure 存储容器的内容?

c# - 我如何将 Controller 与过滤器一起进行单元测试(带有 autofac 的 ASP.NET MVC)

c# - 在 TFS API 中,如何获取给定测试的完整类名?

c# - 如何使用 System.Net.Http 发送如下所示的 cURL 请求?

azure - 如何通过Python SDK检查Azure公共(public)IP是否为 'associated'

asp.net-mvc-4 - Autofac 和 ASP .Net MVC 4 Web API

asp.net-mvc-3 - Autofac 相当于 Ninject 的 WhenInjectedInto()

c# - DataContractSerializer 失败,空数据

C# 单元测试中如何过滤非断言异常

azure - 是否建议将已部署的 v2 azure 功能升级到 v3,还是创建新资源并从头开始部署到它们更好?