计时器中的Web应用程序中的Autofac范围

时间:2011-11-10 23:05:25

标签: autofac

我使用autofac web集成,它可以很好地解决生命周期绑定组件。但是从计时器调用了一段代码,我在Autofac.Integration.Web.ContainerProvider.AmbientRequestLifetime.get()中的某处获得了null引用异常。显然这是因为在计时器中没有HttpContext并且无法获得生命周期。 根据文档,我需要调用“container.BeginLifetimeScope”并使用此生命周期来解析我的组件。但该组件是相当低级的(网络,消息传递),并且它无法访问asp的Global对象来访问容器对象。全局对象也无法访问如此低级别的组件以手动注入容器。 为了使问题更加困难,可以从网页调用此组件并需要Web请求生命周期,并且需要从具有手动构造生命周期的计时器调用此组件(或IDispose + using也可以)。 如果需要2种寿命范围,我该如何处理情况呢?

1 个答案:

答案 0 :(得分:2)

有两件事可以帮助你开始朝着正确的方向前进。

首先,builder.Register(...).InstancePerLifetimeScope()会为您提供“每个请求”以及“每个自定义生命周期”范围。

其次,如果您在计时器下踢掉了东西,请在计时器方法的入口点手动创建一个新的生命周期范围:

void OnTimer()
{
    using (var timerScope = ApplicationContainer.BeginLifetimeScope())
    {
        var someComponent = timerScope.Resolve(...);
        someComponent.DoWork();
    }
}

这里,ApplicationContainer是您在Web请求启动时在Global.asax中构建的那个 - 当计时器停止时,您需要找到一些方法来获取它。