3

我有一个 .Net 4.0 WCF 服务,我正在尝试为其设置 ninject。我下载了 ninject 的 WCF扩展并查看了 TimeService 示例。一切看起来都很简单,但是我看不到 ninject 是如何正确完成工作的,因为有一个无参数的构造函数手动注入依赖项。

 public TimeService()
    : this(new SystemClock())
{
}

public TimeService( ISystemClock systemClock )
{
    _systemClock = systemClock;
}

据我了解,此代码永远不会使用 ninject 绑定。如果我不提供任何参数,第一个构造函数将调用第二个构造函数。在测试中并且我传入我的模拟对象时,将调用第二个构造函数。我对 WCF 和 ninject 都很陌生,如果我遗漏了任何明显的东西,我深表歉意!

谁能解释一下?

谢谢

4

1 回答 1

2

默认情况下,Ninject 会选择参数数量最多的构造函数,它有足够的绑定信息来填充。因此,如果 Ninject 模块能够提供 ISystemClock 实现,则 Ninject 将更喜欢第二个构造函数。

您在此处显示的模式通常在您希望允许注入依赖项时使用,但在没有特定依赖项的情况下仍然有一个逻辑默认值可以回退。正如您所指出的,您可以在单元测试时提供自己的 ISystemClock 模拟,这为您提供了确定性测试的优势。同样,如果您有某些理由想要提供自定义 ISystemClock 实现,您可以使用匹配的绑定设置您的 Ninject 模块。

另一方面,对于大多数用途而言,库存 SystemClock 实现可能是最好的实现,因此与其强迫您设置 ISystemClock 绑定以使该类均匀运行,还提供了一个替代构造函数,它使用 SystemClock 作为默认实现。如果您没有为 ISystemClock 服务指定绑定,Ninject 将依赖此构造函数。

编辑

在这种特殊情况下,它没有运行的原因是 TimeService 类的以下属性:

[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]

我不完全理解这里发生了什么,但它以某种方式阻止了 Ninject 用于创建服务。如果您注释掉这一行,它应该可以按预期工作。

于 2010-11-02T15:30:50.007 回答