我们目前正在评估是否可以将Ninject用于未来的项目。一个条件是,libary不应该强迫我们调用Dispose方法。那么,真的有必要吗?不会调用它会导致内存泄漏和其他丑陋的东西吗?
答案 0 :(得分:3)
我不认为Ninject是一个纯粹的托管解决方案,如果不调用Dispose(),就会出现内存泄漏或其他问题。特别是因为您只是在终止应用程序之前调用内核的Dispose()方法作为最后的事情之一,因此GC或OS的进程隔离会回收内存。
你想要一个允许你调用Dispose()的IoC容器的原因是它将在任何实现IDisposable的服务提供者上调用Dispose()。我认为,这是一个有用的功能,因为服务提供商可能拥有非托管资源或需要等待异步操作完成(或者至少以有序的方式中止它们)。
我认为这就是大多数在其内核/提供者/定位器类上实现IDisposable的IoC容器背后的原因。
为什么在IoC容器上使用Dispose()会给您带来麻烦?到目前为止,我总是找到一个合适的地方来调用它,无论是在控制台应用程序,基于XAML的WPF应用程序还是Xbox游戏中。
答案 1 :(得分:3)
您可以通过某种方式配置Ninject以帮助您进行Dispose。这取决于您使用Ninject的范围和策略。 例如:
InTransientScope
as soon as the scope object to which the created object is tied is collected by GC.,OnDeactivation
方法或InScope(x => new DisposableStrategy())
StandardScopeCallbacks.Request
使您的对象与HttpRequest
一起处理。这对Web应用程序很有用。