Ninject的处置方法真的有必要吗?

本文关键字:真的 方法 Ninject | 更新日期: 2023-09-27 18:35:24

我们目前正在评估是否可以在未来的项目中使用Ninject。一个条件是,库不应该强迫我们调用 Dispose 方法。那么,真的有必要吗?不调用它会导致内存泄漏和其他丑陋的东西吗?

Ninject的处置方法真的有必要吗?

我不认为 Ninject 是一个纯粹的管理解决方案,如果你不调用 Dispose(),内存泄漏或其他问题不会有任何问题。特别是因为您只会调用内核的 Dispose() 方法作为终止应用程序之前的最后一件事,因此无论如何都会由 GC 或操作系统的进程隔离回收内存。

你想要一个允许你调用Dispose()的IoC容器的原因是,它将在任何实现IDisposable的服务提供商上调用Dispose()。我相信这是一个有用的功能,因为服务提供商可能拥有非托管资源,或者需要等待异步操作完成(或者至少以有序的方式中止它们)。

我会走得更远,打赌这是大多数 IoC 容器在其内核/提供程序/定位器类上实现 IDisposable 背后的原因。

为什么在 IoC 容器上使用 Dispose() 对您来说是一个问题?到目前为止,我总能找到一个合适的位置来调用它,无论是在控制台应用程序、基于 XAML 的 WPF 应用程序还是 Xbox 游戏中。

你可以配置Ninject来帮助你处理Dispose。这取决于您对Ninject使用的范围和策略。例如:

    一旦 GC 收集了所创建对象绑定到的范围对象,
  • Ninject 就会释放每个具有除InTransientScope以外的其他范围的一次性对象。
  • 当内核正在处置时,将释放单例,
  • 您也可以使用OnDeactivation方法或InScope(x => new DisposableStrategy())
  • 或者使用StandardScopeCallbacks.Request使对象与HttpRequest一起处置。这对于 Web 应用程序很有用。