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

时间:2010-02-19 15:44:06

标签: .net dependency-injection inversion-of-control structuremap ioc-container

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

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

  • ApplicationController中
    • 控制器
      • 的AuthenticationService
        • UserRepository

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

我意识到这是一个简化的视图,并且您的真实生产架构会复杂得多,但DI(以及 Constructor Injection )的优点在于它违反了Single Responsibility Principle如此明显。

一个班级开始得到太多的依赖关系,这表明你应该refactor to an Aggregate Service

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

您永远不必在图表中间解析实例。解析是你do in the Composition Root和(理论上)只有一次。

在单元测试方面,您shouldn't have to use a DI Container at all

答案 1 :(得分:0)

不确定您的applicationController与您的控制器的关系,但一般情况下,您的控制器将依赖您的服务,您的服务将依赖于存储库。

e.g。

public MyXyzController
{
  public MyXyzController(IAuthenticationService authenticationService){...}
}

public class AuthenticationService : IAuthenticationService
{
  public AuthenticationService(IUserRepository userRepository){...}
}

这样,当您请求(即解析)控制器时,您的IOC容器将自动解析所有依赖关系。