代码之家  ›  专栏  ›  技术社区  ›  n8wrl

autofac、ASP.NET集成和httpRequestsScoped

  •  3
  • n8wrl  · 技术社区  · 15 年前

    我以前问过一个问题 here 关于autopac在HTTP请求结束时不处理我的对象。我现在认为我有一个更大的问题,因为有证据表明它提供了相同的请求对象。再说一遍,我用的是更详细的说明 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;
    

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

    cachingdbconnections对象的某些方法在随后的请求中失败,这使我相信我得到的是上次得到的相同的请求,而不是每个请求的新请求。

    这有道理吗?我做错什么了?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Nicholas Blumhardt    15 年前

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

    例如。

    A->B->C

    如果a是'factory',b是'singleton',c是'factory',那么解析a将得到对singleton b的引用,该引用始终引用相同的c。

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

    我的猜测如何?这是问题吗?

    尼克

        2
  •  1
  •   n8wrl    15 年前

    我明白了!

    我向对象实例请求的容器不正确-我向应用程序容器请求对象,而不是请求容器。

    哦!