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 次 |
最近记录: |