将具体实例注入 Ninject 解析器

Injecting concrete instance into Ninject resolver

使用 NInject 使用接口建立依赖注入非常容易。

所以比如说我有一个 class 比如

public class WindowManagerService : IWindowManager 
{
    public WindowManagerService(ILogger logger) { }
}

做这样的事情很容易:

public class NinjectModuleLoader : NinjectModule
{
    public override void Load()
    {
        this.Bind<IWindowManager>().To<WindowManagerService>().InSingletonScope();
    }
}

并成功配置依赖注入。

然而,我 运行 遇到的问题是,当我需要向构造函数中提供 class 的具体实例时,例如以下示例:

public class ObservableLogger : ILogger
{
    public ObservableLogger(Dispatcher dispatcher) { }
}

在上面的示例中,我需要能够传递调度程序的具体实现,因为我不能使用 DI 来建立此 link 并且必须引用应用程序范围内的 Dispatcher 实例。

基本上我希望能够做的是这样的事情:

this.Bind<ILogger>().To(new ObservableLogger(Dispatcher)).InSingletonScope();

那么如何向 NInject 依赖管理器提供依赖的具体实现呢?

您可以使用工厂方法:

this.Bind<ILogger>().ToMethod(context => new ObservableLogger(Dispatcher));

...或按照文档中的说明创建您自己的自定义提供程序:https://github.com/ninject/Ninject/wiki/Providers,-Factory-Methods-and-the-Activation-Context

还有ToConstantToConstructor方法:

this.Bind<ILogger>().ToConstant(new ObservableLogger(Dispatcher));

更多信息请参考this blog post