Mic*_*ael 5 c# scope dependency-injection ninject
我有一个使用的控制台应用程序kernel.Get<SomeClass>();然而,SomeClass依赖于SomeDisposableClass.如何设置我的绑定以处理SomeDisposableClass何时SomeClass收集垃圾?我的MVC应用程序使用InRequestScope并且效果很好,但似乎没有类似的控制台应用程序范围.
这里的例子:
public class SomeClass {
public SomeClass(SomeDisposableClass c) {
this.C = c;
}
private SomeDisposableClass C { get; set; }
// ... Business Methods ... //
}
Run Code Online (Sandbox Code Playgroud)
我的模块
kernel.Bind<ISomeClass>().To<SomeClass>().In???Scope()
Run Code Online (Sandbox Code Playgroud)
我的控制台应用
public static void Main() {
SomeFunc();
SomeFunc();
Console.ReadLine();
}
public static void SomeFunc() {
ISomeClass someClass = kernel.Get<ISomeClass>();
// work
}
Run Code Online (Sandbox Code Playgroud)
我希望SomeDisposableClass在SomeFunc完成时(或调用垃圾收集器时)进行处理.但我不确定使用哪种绑定范围.InTransientScope永远不会召唤处置.我是否只需要制作SomeClass一次性的并Dispose()使用using声明在控制台应用程序中实现并包装我的所有用法?
在Ninject2中,您可以通过以下方式执行此操作:
Bind<IService>().To<ServiceImpl>().InScope(ctx => ...);
Run Code Online (Sandbox Code Playgroud)
例如,用于的回调InRequestScope()是:
ctx => HttpContext.Current
Run Code Online (Sandbox Code Playgroud)
由于HttpContext.Current设置为HttpContext每个Web请求的新实例,因此将仅为每个请求激活该服务的单个实例,并且当请求结束并且HttpContext(最终)收集时,将停用实例.
您可以在控制台中使用静态变量来引用将控制生命周期的对象.
public static object LifetimeController = new object();
Run Code Online (Sandbox Code Playgroud)
您可以将其注册为您的生命周期控制对象
Bind<IService>().To<ServiceImpl>().InScope(ctx => LifetimeController);
Run Code Online (Sandbox Code Playgroud)
每次要刷新对象时,都可以使用这样的方法
public static void StartNewLifetime()
{
LifetimeController = new object();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5823 次 |
| 最近记录: |