我有一个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),当我添加新的“全局”依赖。