我有一个控制台应用程序,使用
kernel.Get<SomeClass>();
。然而,SomeClass
依赖于SomeDisposableClass
。我该如何设置我的绑定以在SomeClass
被垃圾回收时处理SomeDisposableClass
的释放?我的MVC应用程序使用InRequestScope
非常好用,但似乎没有类似控制台应用程序的范围。public class SomeClass {
public SomeClass(SomeDisposableClass c) {
this.C = c;
}
private SomeDisposableClass C { get; set; }
// ... Business Methods ... //
}
我的模块
kernel.Bind<ISomeClass>().To<SomeClass>().In???Scope()
我的控制台应用程序
public static void Main() {
SomeFunc();
SomeFunc();
Console.ReadLine();
}
public static void SomeFunc() {
ISomeClass someClass = kernel.Get<ISomeClass>();
// work
}
当SomeFunc
完成时(或垃圾收集器被调用时),我希望SomeDisposableClass
被处理。但是,我不确定应该使用哪个绑定范围。 InTransientScope
永远不会调用dispose。我只需使SomeClass
可处理,并实现Dispose()
,然后在控制台应用程序中用using
语句包装所有用法即可。
SomeClass
实现IDisposable
吗?然后在调用StartNewLifetime()
时,Ninject应该调用先前的SomeClass
实例上的Dispose()
方法?无论如何,这不是我的问题,所以我会退到一边,让OP做出决定… - McGarnagleNinject
中的INotifyWhenDisposed
接口,如果您想确定性地停用“拥有”的实例。如果作用域对象实现了此接口,则在Dispose()时,它拥有的任何实例都将立即停用。 - qujckBind<IService>().To<ServiceImpl>().InScope(ctx => new object())
,这使得每次都会得到一个新的对象,同时仍会回收ServiceImpl。尽管我需要等待垃圾回收,但当我调用GC.Collect()时,它确实释放了相关的可处理对象。 - Michael