我有一个控制台应用程序,使用kernel.Get<SomeClass>();
然而,SomeClass
依赖于SomeDisposableClass
。当SomeClass
被垃圾收集时,如何设置我的绑定来处理SomeDisposableClass
?我的MVC应用程序使用InRequestScope
,这很好,但似乎并没有类似的控制台应用程序的范围。当SomeFunc
完成到被布置Ninject瞬间范围与配置
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
}
我想为SomeDisposableClass
(或当:
实施例在这里垃圾收集器被调用)。但我不确定要使用哪个绑定范围。 InTransientScope
不会调用dispose。难道我只是做SomeClass
一次性和实施Dispose()
和我的包裹在控制台应用程序的所有用法与using
声明?
我upvoted,因为这是真棒......但我似乎无法到让它与测试一起工作。你需要'SomeClass'实现'IDisposable',你会不会?当你调用'StartNewLifetime()'时,Ninject应该在之前的'SomeClass'实例上调用'Dispose()'?无论如何,不是我的问题,所以我会放在一边,所以OP可能会作出判决... – McGarnagle
@McGarnagle这里的细节:回调的对象也可以实现'INotifyWhenDisposed',一个Ninject接口,如果你希望确定性地停用“拥有”实例。如果作用域对象实现此接口,那么当它是Dispose()'d时,它所拥有的任何实例将立即停用。 – qujck
我将此标记为答案。我最终做的是'绑定()。到().InScope(ctx => new object());'这给了我一个新的对象,每次仍然是GC ServiceImpl。我不得不等待垃圾收集,但是当我做了GC.Collect()时,它确实释放了依赖的一次性对象。 –
Michael