【问题标题】:Injecting concrete instance into Ninject resolver将具体实例注入 Ninject 解析器
【发布时间】:2018-07-18 07:20:49
【问题描述】:

使用 NInject 很容易通过接口建立依赖注入。

例如说我有一个像

这样的课程
public class WindowManagerService : IWindowManager 
{
    public WindowManagerService(ILogger logger) { }
}

这样做很容易:

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

并成功配置依赖注入。

但是我遇到的问题是当我需要向构造函数中提供一个类的具体实例时,例如以下示例:

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

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

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

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

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

【问题讨论】:

    标签: c# wpf dependency-injection ninject ninject-extensions


    【解决方案1】:

    你可以使用工厂方法:

    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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 2021-05-10
      相关资源
      最近更新 更多