我们目前正在评估是否可以将 Ninject 用于未来的项目。一个条件是,库不应强迫我们调用 Dispose 方法。那么,真的有必要吗?不调用它会导致内存泄漏和其他丑陋的东西吗?
问问题
2094 次
2 回答
3
如果您不调用 Dispose(),我认为作为纯托管解决方案的 Ninject 不会出现内存泄漏或其他问题。特别是因为您只会调用内核的 Dispose() 方法作为您在终止应用程序之前所做的最后一件事,因此内存将被 GC 或操作系统的进程隔离回收。
您需要一个允许您调用 Dispose() 的 IoC 容器的原因是它将在任何实现 IDisposable 的服务提供程序上调用 Dispose()。我相信这是一个有用的功能,因为服务提供者可能拥有非托管资源或需要等待异步操作完成(或至少以有序的方式中止它们)。
我敢打赌,这就是大多数在其内核/提供者/定位器类上实现 IDisposable 的 IoC 容器背后的原因。
为什么在 IoC 容器上使用 Dispose() 对您来说是个问题?到目前为止,我总是找到一个合适的位置来调用它,无论是在控制台应用程序、基于 XAML 的 WPF 应用程序还是 Xbox 游戏中。
于 2012-05-25T12:28:00.390 回答
3
您可以配置 Ninject 以帮助您使用 Dispose。这取决于您对 Ninject 使用的范围和策略。例如:
- Ninject 会释放具有另一个作用域的每个 Disposable 对象,而不是
InTransientScope
在 GC 收集所创建对象所绑定的作用域对象时。, - 当内核处理时,单例将被处理,
- 你也可以使用
OnDeactivation
方法或InScope(x => new DisposableStrategy())
- 或用于
StandardScopeCallbacks.Request
使您的对象与HttpRequest
. 这对 Web 应用程序很有用。
于 2012-05-25T15:09:21.623 回答