与ioc的asp.net mvc – >避免与BaseController的构造函数汤

我有一个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)来parsing我的控制器,所以知道我可以删除构造函数依赖关系,并让它自动连接公共属性。

除了屏蔽一些依赖关系之外,还有没有这样做的理由?

 public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 

这种方法似乎更具可读性,并清楚地概述了与特定控制器相关的依赖关系。

或者我弄错了,BaseController不是存储交叉服务的正确位置。

感谢赞赏。

谢谢,克里斯

我能想到的一个原因是惯例 – 许多人按照需要将二次喷射解释为非必需的依赖和构造器注入。 Altough – 这只是一个惯例,在这个例子中不会阻止我使用自动连线的属性。

依赖注入是为了简化你的工作(我承认这不是使用DI的最重要的原因,但我认为这是一个正当的理由),而不是让它变得更难。 考虑一个情况,当你不得不添加另一个“全球”服务。 你将不得不通过你的项目中的每一个控制器,并修改一个构造函数,这真的很糟糕。

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