autofac,ASP.NET集成和HttpRequestScoped

时间:2009-09-03 15:35:27

标签: asp.net autofac

我之前问了一个问题here,关于autofac在HTTP请求结束时没有处理我的对象。我现在认为我有一个更大的问题,因为有证据表明它正在提供SAME对象请求请求。我再次使用他们的指示here。我的测试有点复杂,因为我正在使用委托语法来创建一个对象,但我认为我将其标记为请求生命周期。的global.asax.cs:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    var builder = new Autofac.Builder.ContainerBuilder();
    builder.Register<IDBConnectionSelector>(
            (c) => new CachingDBConnections(ConstructorArgs...))
        .HttpRequestScoped();

    var container = builder.Build();
    _containerProvider = new ContainerProvider(container);
}
public IContainerProvider ContainerProvider
{
    get { return _containerProvider; }
}
static IContainerProvider _containerProvider;

我的目的是注册IDBConnectionSelector以获取使用自定义构造函数但具有HTTP请求范围创建的具体类型CachingDBConnections。

CachingDBConnections对象的某些方法在后续请求中失败,导致我相信我得到的是我上次获得的那个,而不是每个请求都是新的。

这有意义吗?我做错了什么?

2 个答案:

答案 0 :(得分:2)

大多数情况下(在任何IoC容器中),您会发现依赖链中的一个组件是单个组件。

E.g。

A - &gt; B - &gt; ç

如果A是'工厂',B是'单例'而C是'工厂',那么解析A将获得对单例B的引用,它将始终引用相同的C.

为了在每次解决A时创建新的C,B也必须是“工厂”。

我的猜测怎么样?这是问题吗?

尼克

答案 1 :(得分:1)

我明白了!

我向WRONG容器询问了对象实例 - 我向应用程序容器询问了对象而不是请求容器。

D'哦!