我有一个 BaseController,我用它来容纳我对 MVC 项目的横切关注点。
但是,这意味着我的 Controller 有 3 个依赖项:
public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c)
这样做的副作用是我的每个派生 Controller 的构造函数都充满了参数:
public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration)
: base(locationService,userService, configuration )
我正在使用 IoC (Windsor) 来解析我的 Controller ,所以知道我可以删除构造函数依赖项并让它自动连接公共(public)属性。
除了屏蔽一些依赖项之外,还有什么不这样做的原因吗?
public AccountController (IAccountService, IFormsAuthentication, IMembershipService)
这种方法似乎更具可读性,并清楚地概述了与该特定 Controller 相关的依赖关系。
或者我完全弄错了,BaseController 不是存储横切服务的正确位置。
感谢您的想法。
谢谢, 克里斯
最佳答案
我能想到的一个原因是惯例——许多人将 setter 注入(inject)解释为非必需的依赖项,将构造函数注入(inject)解释为必需的。虽然 - 这只是一个约定,并不会阻止我在这个例子中使用自动连接的属性。
依赖注入(inject)应该简化您的工作(我承认这不是使用 DI 的最重要原因,但我认为这是一个正当理由),而不是让它变得更难。考虑您必须添加另一个“全局”服务的情况。您将不得不遍历项目中的每个 Controller 并修改构造函数,这真的非常糟糕。
我想到了另一个解决这个问题的想法:创建一个收集器对象,它存储所有“全局”依赖项,将其传递给具体的 Controller ,然后传递给基础,这将获得所需的依赖项。它会解决添加依赖项的问题,你会清楚地说明,具体 Controller 正在将依赖项传递给基类。不过我不喜欢它,因为当我添加新的“全局”依赖项时,它仍然需要更改 2 个类(“依赖项收集器”和 BaseController)。
关于asp.net-mvc - 带有 ioc 的 asp.net mvc --> 使用 BaseController 避免构造函数汤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1177700/