【发布时间】:2013-01-26 19:14:04
【问题描述】:
我正在开发 ASP.NET MVC3 解决方案,该解决方案将依赖注入与 autofac 结合使用。 我们的控制器是由 autofac 正确创建的,并且所有需要的对象都被正确传入。这些对象通常包括将域对象转换为 MVC(视图)模型的服务、存储库和映射器。所以控制器构造函数看起来有点像:
public abcController(
ILogger logger,
IabcRepository abcRepository,
IabcService abcService,
IMapper<AbcDomain, AbcViewModel> abcMapper,
...
)
不幸的是,随着时间的推移,这些构造函数参数列表往往会迅速增长。我们的一些控制器现在需要 60 个或更多参数。
我们是否在这里创建了一些反模式?
编辑
我应该提到我们尝试遵循瘦控制器模式。此外,这些参数中的大多数往往是映射器——大约 66%。控制方法通常很简单,遵循以下任一模式:
- 根据参数调用适当的服务或存储库
- 使用映射器将结果转换为适当的视图模型
- 将视图模型传递给视图
或者这个模式:
- 从发布操作接收模型
- 使用映射器将其转换为适当的域对象
- 使用域对象调用适当的服务或存储库
【问题讨论】:
-
你可以用
injection by property代替injection by constructor。 -
@HamletHakobyan - 嗯......这可能有效,我将不得不尝试看看它如何与 autofac 一起工作。在单元测试方面,我可以看到这个解决方案的好处。你为什么不把它作为一个答案。
-
Autofac 还支持动作注入,请参见此处stackoverflow.com/questions/5411881/…。因此,仅在一个操作中需要的参数可以这样完成。 60 还是很多 :)
-
作为一般经验法则,构造函数应该有不超过 5 个依赖项。 60 个依赖项是依赖项的 12 倍。你如何测试一个有 60 个依赖项的类?您可能会从 business operations inside their own class 分组中受益。
-
Stevens 代码是我构建大量架构的基础。它确实清理了我的代码 + Jimmy Bogard 的一些映射内容、各种自定义 ActionResult 和一些自定义 ModelEnricher 工作。
标签: c# asp.net-mvc-3 dependency-injection autofac