2009-09-03 63 views
3

我以前问一个问题here有关HTTP请求结束时autofac不处置我的对象。我现在认为我有一个更大的问题,becuasse有证据表明它正在提供SAME对象请求请求。再次,我正在使用他们的说明here。我的测试有点复杂,因为我使用委托语法来创建一个对象,但我想我将它标记为请求生命期。的Global.asax.cs:autofac中,ASP.NET集成和HttpRequestScoped

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对象的某些方法在后续请求中失败,导致我相信我得到的是我上次得到的同一个请求,而不是每个请求的新请求。

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

+1

,如果它的确与众不同,但我想这个注册您的服务不知道:builder.Register( C =>新CachingDBConnections(ConstructorArgs ...)) 。至于()HttpRequestScoped(); – 2009-09-03 16:34:49

+0

该语法更有意义,但结果相同。更多挖掘我猜 - 感谢信息! – n8wrl 2009-09-03 16:54:00

回答

1

我想通了!

我在问WRONG容器的对象实例 - 我问的应用程序容器的对象,而不是请求容器。

D'oh!

2

大部分发生这种情况(在任何IoC容器)的时候,你会发现,沿着依赖关系链中的一个组成部分是一个单。

E.g.

A - >乙 - “ç

如果A是 '工厂',B是 '单' 和C是 '工厂',则解析将获得的单乙一个参考,这将始终引用同样C.

为了获得创建每次你解决时间一个新的C,B也必须是“工厂”。

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

尼克

+0

嗨尼古拉斯!非常感谢您办理登机手续。我找到了答案并发布了我的答案。 – n8wrl 2009-09-03 17:56:56