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

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

我有一个 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/

相关文章:

asp.net-mvc - 我可以将我的 DTO 类公开给 WCF 客户端,还是应该使用自动生成的类?

asp.net-mvc - mvc将httpcontext注入(inject)服务层

c++ - 在 Windows Compact 2013 中标记存储卷

asp.net-mvc - 数据绑定(bind) : 'Models' does not contain a property with the name 'Key'

javascript - 混合 Javascript 和 Razor 代码

java - 作为后台进程运行 java 应用程序

c++ - 在 Windows 上检查非提升用户的文件权限

c# - ExceptionFilterAttribute C# 中的依赖注入(inject)

dependency-injection - 针对控制反转框架运行的依赖浏览器

c# - 在 C# 中创建一个小型 IoC 容器