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

带IOC的ASP.NET MVC——>避免使用baseController的构造函数汤

  •  5
  • Chris  · 技术社区  · 15 年前

    我有一个basecontroller,用于存储我对MVC项目的横切关注点。

    但是,这意味着我的控制器有3个依赖项:

     public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c) 
    

    这样做的副作用是,每个派生控制器的构造函数都充满了参数:

      public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration)
          : base(locationService,userService, configuration )
    

    我正在使用IOC(windsor)解析控制器,因此我可以删除构造函数依赖项,并让它自动连接公共属性。

    除了掩盖某些依赖项之外,是否有理由不这样做?

    public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 
    

    这种方法看起来更易读,并清楚地概述了与特定控制器相关的依赖关系。

    或者是我弄错了,而一个basecontroller不是存储横切服务的正确位置。

    思想受到赞赏。

    谢谢, 克里斯

    1 回复  |  直到 15 年前
        1
  •  1
  •   maciejkow    15 年前

    我能想到的一个原因是约定——许多人将setter注入解释为不需要的依赖项,而将构造函数注入解释为需要的。尽管如此,这只是一个约定,不会阻止我在这个例子中使用自动连线属性。

    依赖注入应该简化您的工作(我承认这不是使用DI的最重要原因,但我认为这是一个有效的原因),而不是让它变得更加困难。当您必须添加另一个“全局”服务时,请考虑这种情况。您必须遍历项目中的每个控制器并修改一个构造函数,这真的非常糟糕。

    我想出了另一个解决这个问题的方法:创建一个收集器对象,它存储所有的“全局”依赖项,将其传递给具体的控制器,然后传递给基础,基础将获得所需的依赖项。它可以解决添加依赖项的问题,并且您可以清楚地声明,具体的控制器正在向基类传递依赖项。但我不喜欢它,因为当我添加新的“全局”依赖项时,它仍然需要两个类来更改(“依赖项收集器”和BaseController)。