3

我之前在这里问过一个关于 autofac 在 HTTP 请求结束时不处理我的对象的问题。我现在认为我有一个更大的问题,因为有证据表明它正在提供 SAME 对象请求到请求。同样,我在这里使用他们的说明。我的测试有点复杂,因为我使用委托语法来创建一个对象,但我认为我将它标记为请求生命周期。全球.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 对象的某些方法在后续请求中失败,这让我相信我得到的是上次得到的相同方法,而不是每个请求的新方法。

那有意义吗?我究竟做错了什么?

4

2 回答 2

2

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

例如

A -> B -> C

如果 A 是“工厂”,B 是“单例”,C 是“工厂”,则解析 A 将获得对单例 B 的引用,该单例将始终引用相同的 C。

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

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

缺口

于 2009-09-03T17:50:21.327 回答
1

我想到了!

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

哦!

于 2009-09-03T17:55:52.030 回答