【发布时间】:2012-04-20 20:31:29
【问题描述】:
在使用带有构造函数注入的依赖注入框架时使用可选参数是否被认为是一种不好的做法?
例子:
public class ProductsController
{
public ProductsController(IProductService productService = null, IBackOrderService = null)
{
}
}
我已将这两个参数都指定为可选,但我的 DI 框架将始终注入这两个依赖项。如果我向我的控制器添加一个需要新依赖项的新操作,那么将新依赖项设为可选会不会很糟糕?即使现有测试不需要新的依赖项,我也可能会破坏数十个单元测试。
编辑
人们似乎对我的问题感到困惑。我从不在我的 Web 应用程序中手动构建 ProductsController。这由控制器工厂处理(自动注入依赖项)。
我不喜欢这样的单元测试:
[Test]
public void Test1()
{
var controller = new ProductsController(new MockProductService(), new MockBackOrderService());
}
现在我决定向我的控制器添加一个新的操作方法。此新操作需要新的依赖项,但现有操作都不需要。现在我必须回去修改 100 个不同的单元测试,因为我添加了一个新参数。我可以通过使参数可选来避免这种情况,但我想知道这是否是一个坏主意。我的直觉说不,因为它唯一影响的是单元测试。
【问题讨论】:
-
ProductsController在没有依赖关系的情况下如何运作? -
@Matthew ProductsController 的某些部分可以在没有任何依赖关系的情况下运行。不过,显然 DI 容器总是会注入所有依赖项。
-
我从不手动实例化我的控制器,除非在我的单元测试中。这就是为什么我想知道是否将参数设为可选是否重要。默认情况下,参数将始终注入(在我的单元测试之外)。
-
如果它们总是被注入到您的生产代码中,那么如果您不通过这些依赖项,您在测试什么?听起来不对。
-
我正在使用模拟进行单元测试?我不使用依赖注入将模拟注入控制器。这似乎有点傻。
标签: c# asp.net-mvc dependency-injection optional-parameters