2013-03-01 53 views
3

如果我有以下几点:如何告诉Ninject不要注入我的构造函数参数之一?

public MyClass(IServiceOne serviceOne, IServiceTwo serviceTwo, IServiceThree serviceThree = null) 
{ 
    this.serviceOne = serviceOne; 
    this.serviceTwo = serviceTwo; 
    this.serviceThree = serviceThree ?? new ServiceThree("some-info"); 
} 

我怎么能告诉Ninject到前两个参数结合,而不是类型IServiceThree的一个?这甚至有可能吗?

我希望serviceThree作为构造函数参数的原因是为了可测试性 - 我需要能够从我的测试中注入模拟。

+0

这是一种设计的气味。你绝不应该允许在构造函数中注入'null'。相反,你应该简单地向构造函数中注入一个'ServiceThree'实例。国际海事组织,Ninject应该永远不会有“AllowNullInjection”属性。 – Steven 2013-03-03 12:57:59

+0

如何仅用两个参数重载构造函数,并特别指出NInject要使用的重载? '[注入] public MyClass(IServiceOne serviceOne,IServiceTwo serviceTwo)' – PPC 2015-06-18 01:50:22

回答

5

如果你不打算使用构造函数注入,那么你也可以将它从构造函数参数列表中移除,并按照你的方式手动初始化它。换句话说,只传递两个参数而不是三个。

更新:你可以做的是注入null值。至于我记得你将不得不这样做以下:

_kernel.Settings.AllowNullInjection = true; 

然后你就可以删除绑定的第三个参数(如果存在)。

+0

我希望它作为构造函数参数的原因是为了可测试性 - 我需要能够从我的测试中注入模拟。对于那个很抱歉。我会澄清我的问题。 – rouan 2013-03-01 12:14:33

+1

不过,您正在构造函数中使用具体的实现。无论通过第三个参数,即使在单元测试中也会被忽略。 – 2013-03-01 12:25:33

+0

感叹。这是当你没有证明阅读问题时会发生什么。抱歉。我为最后一个参数使用默认值,以便我可以使用从我的测试中注入的值或创建一个新实例。我已经更新了我的问题。 – rouan 2013-03-01 12:29:07

0

对于可测试性,你需要模拟你希望表现为null的接口(当你调用它的方法时什么也不做)并作为构造器参数传递。

您所做的事情是错误的,您将测试代码依赖项添加到您的生产代码中。

相关问题