【问题标题】:Autofac and Azure WebJobsAutofac 和 Azure WebJobs
【发布时间】:2018-05-03 06:22:03
【问题描述】:

我们的应用程序大量使用 Autofac Per-Request-Dependencies。 这很有效,符合我们的需求。

现在我们需要监听 AzureWebJobs。

由于我对 Azure WebJobs 很陌生,所以我遵循了 this 教程(这里是 git-sources

现在是棘手的部分。
即使我按照所有说明创建了 AutofacActivator Autofac 似乎无法解决我的 Per-Request 注册依赖项

DependencyResolutionException:没有标签匹配的范围 'AutofacWebRequest' 在实例所在的范围内可见 被要求。这通常表示一个组件已注册 由于 SingleInstance() 正在请求每个 HTTP 请求 组件(或类似场景)。始终在 web 集成下 从 DependencyResolver.Current 或请求依赖项 ILifetimeScopeProvider.RequestLifetime,从不来自容器 自己。

问题

在上述要求下,我有什么办法可以让 Autofac 与 Azure-WebJobs 一起工作?

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

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

【问题讨论】:

    标签: c# azure autofac azure-webjobs


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。不幸的是,您的回答对我没有帮助。正如我已经提到的,我不能更改InstancePerRequest。看来我想做的事情要么是不可能的,要么真的很棘手
    • 看起来您将不得不使用自定义的每个请求范围。我希望上面的链接对你有帮助。这很棘手,但并非不可能。祝你好运!
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多