Autofac newbie here,但我喜欢到目前为止看到的内容。我正在尝试利用已解决对象的请求生命周期,并且在确认请求完成后实际发生了一次处理时遇到了问题。
我有一个一次性对象,我在页面请求开始时得到并在最后处置。我正在使用autofac来获取对象的实例,我想看看autofac是否会为我处理。
我已经对相关对象上的Dispose()方法进行了检测,当我的页面执行生命周期管理时,我可以看到它“触发”。当我不处理自己但是让autofac这样做时,我没有看到任何证据。
我正在使用these指令来配置thords,包括web.config和global.asax更改。我可以很好地实例化对象,但我不知道它是否真的被处理掉了。还有另一步吗?
答案 0 :(得分:1)
无论是在页面内手动处理对象还是让Autofac模块执行此操作,对象的处理时间与请求生命周期的区别都会有所不同。在{HttpApplication.EndRequest'被触发之前,The Autofac ContainerDisposalModule不会dispose the Request container,而是它的对象,这是在请求生命周期的最后。
根据您跟踪对象Dispose方法的跟踪方式,可能会有可能看不到输出。你如何检测你的Dispose方法?
答案 1 :(得分:1)
重新发帖重复一遍:
大部分时间都会发生(在任何情况下) IoC容器)你会找到那个 沿链的组件 依赖是一个单身。
E.g。
A - > B - > ç
如果A是'工厂',B是'单身' 和C是'工厂',然后解决A. 将获得对单身人士的参考 B,总会引用 同样的C。
为了创建新的C 每次你解决A,B也必须 是'工厂'。
答案 2 :(得分:1)
我明白了!
我向WRONG容器询问了对象实例 - 我向应用程序容器询问了对象而不是请求容器。
D'哦!
答案 3 :(得分: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)。