[英]Autofac and Azure WebJobs
我们的应用程序大量使用了Autofac每个请求的依赖关系。 这样效果很好,符合我们的需求。
现在,我们有一个要求收听AzureWebJobs。
由于我对Azure WebJobs不太熟悉,因此我遵循了本教程(在git-sources中 )
现在是棘手的部分。
即使我遵循了所有说明并创建了AutofacActivator
Autofac似乎也无法解决我的按请求注册的依赖关系
DependencyResolutionException:从请求实例的范围中看不到带有匹配“ AutofacWebRequest”标签的范围。 通常,这表明SingleInstance()组件正在请求按HTTP请求注册的组件(或类似方案)。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身请求依赖项。
在上述要求下,有什么方法可以使Autofac与Azure-WebJobs一起工作?
需要明确的是,我的Autofaclistener仅解决一项服务。 那不能注册为SingleInstance,因为它也可以在其他服务上解析。 我也不能按照这里的建议将我的每请求材料更改为InstancePerLifetimeScope
我希望我的问题和我的问题能得到自我解释。 如果没有,请告诉我
Azure webjob不是Web应用程序,它们更像是控制台应用程序。 它们没有请求/响应语义。 他们没有http会话上下文,也没有请求范围。 因此,您不应该使用每个请求的注册,因为它们在webjob中是没有意义的。 如果您坚持使用每个请求的依赖关系,则必须为您的webjob模拟一个请求上下文,这是一种冒险的方法。 您可以轻松地引入内存泄漏和不希望的副作用。 请注意,您正在强迫一种不自然的方式来处理webjobs中的依赖关系范围。 有关更多信息,请参见此页面有关实现自定义按请求范围的信息。
一种简单的处理方法是仅在事件处理程序方法的生存期内获取依赖项范围。 您可以在using
块内明确定义范围(因为不会像在MVC或ASP.NET应用程序中自动创建范围那样在webjob中自动创建范围)。 您必须将类型注册为.InstancePerLifetimeScope()
。 当您退出using
块时,实例将被处置。
因此,在事件处理程序中,您为处理程序方法的每次执行定义了生存期范围:
private void OnEvent(...)
{
using (var scope = container.BeginLifetimeScope())
{
...
var myService = scope.Resolve<IMyService>();
...
}
}
本示例使用显式的Resolve
调用获取服务的实例。 有更好的方法,例如使用autofac工厂方法。
一个更高级的解决方案是实现自己的IJobActivator
。 这样,您可以在Functions
类中使用构造函数注入,并且这些实例的生存期范围将成为处理程序方法执行的生存期。 此答案包含代码示例。 不过,您仍然需要将您的类型注册为.InstancePerLifetimeScope()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.