【问题标题】:Why one controller has repository injected and the other the service为什么一个控制器注入了存储库而另一个控制器注入了服务
【发布时间】:2014-03-18 22:33:23
【问题描述】:

我正在阅读 M. Seemann 的书 .NET 中的依赖注入,第 2 章。此处提供源代码:http://www.manning.com/seemann/

在 ComplexCommerce 解决方案、CommerceWebPresentationModel、HomeController 中,我们将存储库传递给构造函数:

public HomeController(ProductRepository repository, CurrencyProvider currencyProvider)

然后将其传递给新创建的服务!

    public ViewResult Index()
    {
        var currencyCode = this.CurrencyProfileService.GetCurrencyCode();
        var currency = this.currencyProvider.GetCurrency(currencyCode);

        var productService =
            new ProductService(this.repository);

但是,在 BasketController 中,我们有一个服务传递给构造函数,BasketRepository 被注入到该构造函数中。

    public BasketController(IBasketService basketService,
        CurrencyProvider currencyProvider)

据我所知,ProductService 没有实现任何接口,这使得 HomeController 无法测试。

我的问题是:为什么 ProductService 在没有 DI 帮助的情况下被实例化?我错过了什么吗?还是作者遗漏了一些东西(否则在一本非常好的书中!)?

【问题讨论】:

  • 继续阅读;我想你最终会到达那里。
  • 并非每个依赖项都必须通过构造函数注入,或者根本不注入。见第 22 页。
  • @DavidOsborne 我同意,但在这个例子中不是。感谢您的回复。

标签: unit-testing design-patterns dependency-injection solid-principles


【解决方案1】:

希望this discussion thread 对此事有更多了解。

简而言之,它只是一个示例,但并不是本书的亮点之一。我通常不会在实际生产代码库中故意编写这样的代码。

但是,我不同意HomeController 是不可测试的,因为我使用测试驱动开发为本书编写了整个代码库。您可以下载本书的代码并验证它是否包含在测试中。但是,我确实同意 HomeController 比它本来应该更难进行单元测试。

为了记录,我在编码时犯了错误,就像其他人一样......

【讨论】:

  • 感谢链接解释了很多。如果我知道得更好,我就不会读你的书了!我的最后两个项目是您的“做错事”示例的精确副本。我只是想确保我没有遗漏任何东西。我同意你关于测试的观点,但我只是想指出依赖关系使 HomeController 测试变得脆弱。感谢您的回复。
猜你喜欢
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多