【问题标题】:IDisposable: How dispose works with AutofacIDisposable:dispose 如何与 Autofac 一起使用
【发布时间】:2020-05-18 17:54:58
【问题描述】:

所以让我们假设我这样注册一个对象:

builder.Register<IFoo>().AsSingleInstance<Foo>()

现在让我们假设Foo 实现了IDisposable

public class Foo: IDisposable
{
  void Dispose()
  {
    // do something
  };
}

当我在容器的生命周期内调用 Foo.Dispose() 时,它是否会向 CG 发出信号以清除对象?一般来说,IDisposable 只是作为关于如何在没有幕后逻辑的情况下处理非托管资源的一般指南(例如与 using 关键字一起工作)?

【问题讨论】:

    标签: c# garbage-collection dispose


    【解决方案1】:

    你有机会读到这个https://autofaccn.readthedocs.io/en/latest/lifetime/disposal.html 吗?

    附言我没有足够的声誉,这就是我添加答案而不是评论问题的原因:)

    【讨论】:

      【解决方案2】:

      您不需要实现IDisposable 接口。 Autofac 可以自动处理某些组件,但您也可以手动指定处理机制。

      builder.RegisterType<Foo>()
                  .As<IFoo>()
                  .InstancePerLifetimeScope();
      

      更多信息Autofac Dispose

      【讨论】:

        【解决方案3】:

        感谢所有答案,但我主要想要的是如果有人在容器内手动调用 Dispose 方法,容器和 CG 如何相互交互。一般解释 IDisposable 如何在幕后工作。

        我在进一步研究后发现IDisposable 不会以任何方式与容器或/和 CG 交互。因此,如果您调用容器内对象的Dispose,只要有对该对象的引用,它就不会被垃圾收集。所以最后你可以多次调用相同的Dispose 方法而不会出现任何问题,无论它是否在容器中,只需Autofac 将再次调用它(如果你不想,你当然可以禁用 autofac 调用 dispose)

        感谢您的回答!

        【讨论】:

          猜你喜欢
          • 2019-12-22
          • 2023-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-25
          • 1970-01-01
          • 2015-02-10
          • 1970-01-01
          相关资源
          最近更新 更多