具有处理的Ninject瞬态范围

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)

我希望SomeDisposableClassSomeFunc完成时(或调用垃圾收集器时)进行处理.但我不确定使用哪种绑定范围.InTransientScope永远不会召唤处置.我是否只需要制作SomeClass一次性的并Dispose()使用using声明在控制台应用程序中实现并包装我的所有用法?

quj*_*jck 9

在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)

有关更多信息,请参见此处此处

  • 我把它标记为答案.我最终做的是`Bind <IService>().到<ServiceImpl>().InScope(ctx => new object());`这给了我一个新的对象,每次仍然是GC的ServiceImpl.我确实必须等待垃圾收集,但是当我做GC.Collect()时它确实释放了依赖的一次性对象. (3认同)