asp.net mvc with ioc - >使用BaseController避免构造函数汤

时间:2009-07-24 13:35:21

标签: asp.net-mvc windows inversion-of-control

我有一个BaseController,我用它来解决我对MVC项目的交叉问题。

但是,这意味着我的Controller有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 个答案:

答案 0 :(得分:1)

我能想到的一个原因是约定 - 许多人将setter注入解释为非必需的依赖项和构造函数注入。 Altough - 这只是一个约定,并不会阻止我在这个例子中使用自动连线属性。

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

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