代码之家  ›  专栏  ›  技术社区  ›  Luhmann

IOC最佳实践:如何最佳管理依赖关系图?

  •  2
  • Luhmann  · 技术社区  · 15 年前

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

    我应该如何最好地为下面的虚拟插图图建立依赖关系图?

    • 应用程序控制器
      • 控制器
        • 身份验证服务
          • 用户库

    是否在控制器上插入用户存储库,而不是在authenticationservice中插入?如果图表更深入,你会不会从控制器开始得到很多依赖?

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

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

    还有别的办法,我看不见吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    8 年前

    您的依赖关系图看起来不错。如图所示,每个类只有 附属国

    • 应用程序控制器依赖于控制器
    • 控制器依赖于身份验证服务
    • AuthenticationService依赖于UserRepository

    我认识到这是一个简化的视图,您的实际生产体系结构将更加复杂,但是DI的优点(以及 构造器注入 尤其是)它违反了 Single Responsibility Principle 如此明显。

    当一个类开始有太多的依赖关系时,这是你应该 refactor to an Aggregate Service .

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

    您不应该解析图中间的实例。解决问题是你 do in the Composition Root 而且(理论上)只有一次。

    当涉及到单元测试时, shouldn't have to use a DI Container at all .

        2
  •  0
  •   Paul Hiles    15 年前

    不确定ApplicationController与控制器的关系,但一般来说,您的控制器将依赖于您的服务,而您的服务将依赖于存储库。

    例如

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

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