我有一个使用 kernel.Get<SomeClass>();
的控制台应用程序然而,SomeClass
依赖于 SomeDisposableClass
.我如何设置绑定(bind)以处理 SomeDisposableClass
什么时候SomeClass
垃圾收集了吗?我的 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
}
我想要SomeDisposableClass
SomeFunc
时处理完成(或调用垃圾收集器时)。但我不确定要使用哪个绑定(bind)范围。 InTransientScope
永远不会调用 dispose。我只需要制作SomeClass
吗?一次性和实现Dispose()
并用 using
将我所有的用法包装在控制台应用程序中声明?
最佳答案
在 Ninject2 中,您可以通过以下方式做到这一点:
Bind<IService>().To<ServiceImpl>().InScope(ctx => ...);
例如,用于InRequestScope()
的回调是:
ctx => HttpContext.Current
由于 HttpContext.Current
在每个 Web 请求上都设置为 HttpContext
的新实例,因此每个请求只会激活一个服务实例,并且当请求结束并且(最终)收集了 HttpContext
,实例将被停用。
您可以在控制台中使用静态变量来引用控制生命周期的对象。
public static object LifetimeController = new object();
您可以将其注册为您的生命周期控制对象
Bind<IService>().To<ServiceImpl>().InScope(ctx => LifetimeController);
每次你想刷新对象时你都可以有这样的方法
public static void StartNewLifetime()
{
LifetimeController = new object();
}
关于c# - 使用 Dispose 注入(inject) transient 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20548810/