IOC最佳实践:如何最好地管理依赖图?

Luh*_*ann 2 .net structuremap dependency-injection ioc-container inversion-of-control

我正在使用structuremap作为IOC容器进行MVC项目.我们正在进行TDD,我想设置我的依赖项,以便它易于使用,并且易于测试.

我应该如何最好地为下面虚构的插图图形设置依赖图?

  • ApplicationController的
    • 调节器
      • 的AuthenticationService
        • UserRepository

您是否在控制器上注入了userrepository,并且进一步从身份验证服务中注入?如果图表更深入怎么办?你不会从控制器开始获得很多依赖吗?

如果您依赖于您的applicationcontroller,那么您是否也将它注入到控制器上,然后在基础上注入?

如果我让容器解析图中间某处的实例,我将不得不设置容器进行测试?这是一件好事还是最好避免的?

还有另一种方式,我没有看到?

Mar*_*ann 5

你的依赖图看起来很好.如图所示,每个类只有一个依赖项

  • ApplicationController依赖于Controller
  • 控制器依赖于AuthenticationService
  • AuthenticationService依赖于UserRepository

我意识到这是一个简化的视图,并且您的真实生产架构将会复杂得多,但DI(特别是Constructor Injection)的优点在于它违反了单一责任原则这么明显.

一个类开始得到太多依赖项,这表明你应该重构一个聚合服务.

最终的依赖图可能很大,但每个类只依赖于一些抽象,所以从架构的角度来看,这不是问题.

您永远不必在图中间解析实例.解析是你在组合根中做的事情,并且(理论上)只做一次.

在单元测试方面,您根本不必使用DI容器.