autofac,ASP.NET集成和Dispose

时间:2009-09-02 20:15:25

标签: asp.net autofac

Autofac newbie here,但我喜欢到目前为止看到的内容。我正在尝试利用已解决对象的请求生命周期,并且在确认请求完成后实际发生了一次处理时遇到了问题。

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

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

我正在使用these指令来配置thords,包括web.config和global.asax更改。我可以很好地实例化对象,但我不知道它是否真的被处理掉了。还有另一步吗?

4 个答案:

答案 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)。