【问题标题】:autofac, ASP.NET integration, and Disposeautofac、ASP.NET 集成和 Dispose
【发布时间】:2009-09-02 20:15:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net autofac


    【解决方案1】:

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

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

    【讨论】:

    • 很好的问题,彼得 - 我已经尝试了三件事。前两个什么都没有显示——response.write 和 httpcontext.trace,这两者都可以用时间来解释。但第三个是事件日志写入,也没有显示。
    • 我同意。跟踪事件日志不应受到请求生命周期的影响。嗯。
    【解决方案2】:

    重复您重新发布的答案:

    大多数情况下都会发生这种情况(在任何 IoC 容器)你会发现那个 沿链的组件 dependencies 是一个单例。

    例如

    A -> B -> C

    如果 A 是“工厂”,则 B 是“单例” 并且 C 是“工厂”,然后解析 A 将获得对单例的引用 B,它将始终引用 同一个C。

    为了创建一个新的 C 每次你解决A,B也必须 成为“工厂”。

    【讨论】:

      【解决方案3】:

      我想通了!

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

      天哪!

      【讨论】:

      • 是的,这个问题通常很好解决。我通常使用更多的 DI 设施而不是服务定位器设施,所以我不会遇到这种情况。有一次我有一个休眠的 ISession 被引用锁定了我的开发数据库......那里很有趣。
      【解决方案4】:

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

      【讨论】:

      • 感谢您抽出宝贵时间。我知道 dispose 是如何工作的。我的目标是能够在页面不必知道它们是否是一次性的情况下交换实现。 Autofac 的子容器生命周期管理应该做到这一点,而 ASP.NET 集成应该在请求的生命周期内管理它。我只是想确认它确实发生了。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2019-08-25
      • 2010-11-25
      • 2018-07-09
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多