【问题标题】:How do I configure Ninject to inject the NodaTime IClock如何配置 Ninject 以注入 NodaTime IClock
【发布时间】:2015-11-11 06:27:33
【问题描述】:

在我的 NinjectConfigurator 中有

container.Bind<IClock>().To<SystemClock>(); 

我也试过

container.Bind<IClock>().To<SystemClock>().InSingletonScope();

但我收到此错误:

使用从IClockSystemClock 的绑定激活IClock 时出错 没有构造函数可用于创建实现类型的实例。

激活路径: 3)SystemManager类型的构造函数的参数clock中注入依赖IClock 2)将依赖ISystemManager注入到AccountController类型的构造函数的参数systemManager中 1) 请求 AccountController

建议: 1) 确保实现类型具有公共构造函数。 2) 如果你已经实现了 Singleton 模式,请改用 InSingletonScope() 的绑定。

这是我的注入类,与我项目中所有其他使用 IoC 的工作类相同:

private readonly IDateTime _dateTime;
private readonly IClock _clock;

public SystemManager(IDateTime dateTime, IClock clock)
{
    this._dateTime = dateTime;
    this._clock = clock;
}

我在这方面找不到任何帮助。非常感谢任何帮助。

【问题讨论】:

    标签: c# ninject nodatime


    【解决方案1】:

    我自己也有一段时间没用过NInject了,不过相信你想用ToConstant()绑定SystemClock的实例:

    container.Bind<IClock>().ToConstant(SystemClock.Instance);
    

    【讨论】:

    • 你是个传奇。非常感谢!
    • 您能解释一下为什么您认为ninject 意味着 以这种方式处理单例类吗?您是否希望它使用反射来查找静态Instance 成员?这可能是因为异常消息中的以下行,对吧?:2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. 我认为该消息具有误导性,它可能与上下文特征有关,这可能意味着在某些情况下上下文信息可用于创建实例并在其他情况则不然。
    • @BatteryBackupUnit:嗯,这让我看到了以下文档:github.com/ninject/ninject/wiki/Object-Scopes - 给出了一个示例单例类,然后似乎提供了使用 InSingletonScope 的绑定。现在有可能它真的试图将其作为实现单例模式的 alternative ,但如果是这样的话,文档真的不清楚:(
    • 对于那些偶然发现此问答但正在寻找 Microsoft 依赖注入答案(ServiceProvider、ServiceCollection...)的人,您可以使用类似的代码:services.AddSingleton&lt;IClock&gt;(SystemClock.Instance);
    • 如果你使用 Autofac,你可以使用:builder.Register(_ =&gt; SystemClock.Instance).As&lt;IClock&gt;().SingleInstance(); (with builder as ContainerBuilder)
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多