将具体实例注入 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
还有ToConstant
和ToConstructor
方法:
this.Bind<ILogger>().ToConstant(new ObservableLogger(Dispatcher));
更多信息请参考this blog post。
使用 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
还有ToConstant
和ToConstructor
方法:
this.Bind<ILogger>().ToConstant(new ObservableLogger(Dispatcher));
更多信息请参考this blog post。