1

这里是 Autofac 新手,但我喜欢我目前所看到的。我正在尝试利用已解析对象的请求生命周期,但在确认请求完成后确实发生了处置时遇到了麻烦。

我有一个一次性对象,我在页面请求开始时获得并在最后处理。我现在正在使用 autofac 来获取对象的实例,我想看看 autofac 是否会为我进行处理。

我已经在相关对象上检测了 Dispose() 方法,当我的页面进行生命周期管理时,我可以看到它“触发”。当我不处置自己但让 autofac 去做时,我看不到任何证据。

我正在使用这些说明来配置 thigns,包括 web.config 和 global.asax 更改。我能够很好地实例化该对象,但我不知道它是否真的被处置了。还有一步吗?

4

4 回答 4

1

无论您是在页面中手动处理对象还是让 Autofac 模块来处理,根据请求生命周期处理对象的时间都会有所不同。Autofac ContainerDisposalModule不会处置 Request 容器,以及您的对象,直到 HttpApplication.EndRequest 被触发,这是在请求生命周期的最后。

根据您跟踪对对象 Dispose 方法的调用的方式,您可能看不到输出。您如何检测您的 Dispose 方法?

于 2009-09-02T21:18:55.020 回答
1

重复您重新发布的答案:

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

例如

A -> B -> C

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

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

于 2009-09-03T17:54:43.857 回答
1

我想到了!

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

哦!

于 2009-09-03T17:57:29.780 回答
0

Dispose 只不过是一个允许您定义“Dispose”方法的接口。需要一次性类的最常见用途是该类中是否存在应显式释放的资源(例如 Windows 资源句柄)。在大多数情况下,不需要 IDisposable 接口,因为垃圾收集器非常强大,并且在管理内存方面会做得更好。然而,显然有很多情况下必须立即释放句柄,这使我进入下一点,IDisposable 的实现。

不该做什么:

var myClass = MyDisposableClass();

// do stuff with myClass

myClass.Dispose();


Proper usage:

using (var myClass = MyDisposableClass())
{
    // do stuff with myClass
}

编译器将有效地构建与以下内容相同的内容:

MyDisposableClass myClass = MyDisposableClass();
try
{
    // do stuff with myClass
}
finally
{
    myClass.Dispose();
}

重要的区别是无论发生什么,你都知道你的 Dispose 会被调用。此外,您可以绑定一个析构函数(如果存在,则由垃圾收集器调用),然后您可以绑定该析构函数来调用您的 Dispose 方法;但是如果您出于某种原因需要这样做,请确保不要两次释放相同的资源(释放后将指针设置为 null)。

于 2009-09-02T20:33:49.013 回答