最佳实践:如何将多个依赖存储库添加到ActionController中?

时间:2010-01-24 17:11:29

标签: c# asp.net-mvc dependency-injection ioc-container

我有一个InventoryController来获取一个IInventoryRepository,但是我的需求已经改变了,现在其中一个控制器方法还需要使用另外两个存储库,ILoansRepository(以查看有关借出库存项目的获取信息)和另一个,其中发现了一些统计数据和额外信息。

它的工作方式是从InventoryController中的ActionMethod调用的ViewModelBuilder类,它实际上需要那些。目前我正在将IInventoryRepository从控制器传递给构建器,但是我现在应该怎么做呢?我应该将3个存储库注入控制器,然后将它们传递给构建器,就像我现在一直在做的那样吗?或者我应该只做一个IoC.GetInstance()? (虽然我认为这是反模式不是吗?)

谢谢!

3 个答案:

答案 0 :(得分:2)

在这些情况下,以下指导原则发挥作用:

  • 太多依赖项是您违反Single Responsibility Principle的气味。
  • 不要超过四个依赖项。这是一个相对准则。我个人努力减少;一旦我添加了第三个依赖项(参见上面的第一项),我就会感到焦躁不安,但最多可以使用四个。不仅如此,我还要重构。
  • 不要仅仅依赖它来传递它们。

据我所知,有三个依赖项,当涉及到依赖项的数量时,你或多或少都在安全区内,尽管你应该更仔细地开始观察特定的设计方面。

但是,据我了解您当前的实现,您只需将依赖项传递给ViewModelBuilder(因此违反了第三个项目符号)。稍微好一点的选择是定义一个抽象(例如,IViewModelBuilder)并将其注入控制器而不是所有三个存储库。

在任何情况下都不应使用Service Locator反模式(IoC.GetInstance())。

答案 1 :(得分:0)

对控制器负有很大责任。

也许您应该创建一个特殊服务来处理它,并且该服务应该使用构造函数自动连接的那些存储库(通过IoC)。

答案 2 :(得分:0)

  1. 如果您的控制器做了太多工作,请将其拆分为多个。

  2. 如果您只是为了创建ViewModelBinder而注入3个存储库,请不要:注入(I)ViewModelBinder。让IoC容器完成它的工作并为您解决依赖关系;此外,这将简化架构,测试等。

  3. 使用ServiceLocator / GetInstance并不总是可以避免;有时您没有像MVC控制器工厂那样的“根”注入点,并且无法控制对象创建 - 例如,模型绑定器。所以,我让我的模型绑定器(而不是构建器)调用GetInstance,但我创建了自己的“root”:例如,他们调用GetInstance< IModelResolver>,而不是GetInstance< Entity&gt ;.