c# - 使用 Dispose 注入(inject) transient 作用域

标签 c# dependency-injection scope ninject

我有一个使用 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();
}

参见 herehere了解更多信息

关于c# - 使用 Dispose 注入(inject) transient 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20548810/

相关文章:

c# - 如何解析 UTC 日期?

c# - Linq FirstOrDefault - 一个类轮

java - 启动简单的非基于 Web 的 Java 应用程序的官方 Spring Boot 方式是什么?

arrays - Bash,用结果填充数组时奇怪的变量范围

c# - Html.ValidationMessage 未显示消息

c# - 将指针从非托管代码返回到托管代码

javascript - Jasmine 和 Angular : Injecting a service into a service mock

php - ZF2 : Equivalent of getServiceLocator in Zend Form

php - 在函数外重用变量?

c++ - 在 C++ 范围外调用对象