我有一个获取 IInventoryRepository inyected 的 InventoryController,但是我的需求发生了变化,现在其中一个 Controller 方法还需要使用另外 2 个存储库,ILoansRepository(以查看有关借出库存项目的获取信息)和另一个,可以找到一些统计数据和额外信息的地方。
它的工作方式是从 InventoryController 中的 ActionMethod 调用一个 ViewModelBuilder 类,这才是真正需要它们的那个。目前我正在将 IInventoryRepository 从 Controller 传递给构建器,但我现在应该怎么做呢?我是否应该将 3 个存储库注入(inject)到 Controller 中,然后将它们传递给构建器,就像我现在所做的那样?或者我应该做一个 IoC.GetInstance()? (尽管我认为这是一种反模式,不是吗?)
谢谢!
最佳答案
在这种情况下,以下准则会发挥作用:
- 太多的依赖是你违反 Single Responsibility Principle 的味道.
- 依赖项不要超过四个。这是一个相对的准则。我个人努力减少;我一添加第三个依赖项(参见上面的第一项)就变得焦躁不安,但最多可以忍受四个。不仅如此,我还必须重构。
- 不要仅仅为了传递它们而接受依赖。
据我所知,对于三个依赖项,就依赖项的数量而言,您或多或少仍处于安全区内,尽管您应该开始更仔细地观察该特定设计方面。
但是,据我了解您当前的实现,您只是将依赖项传递给 ViewModelBuilder(因此违反了第三条)。一个稍微好一点的选择是定义一个抽象(比如 IViewModelBuilder)并将其注入(inject) Controller 而不是所有三个存储库。
在任何情况下都不应求助于服务定位器反模式 (IoC.GetInstance())。
关于c# - 最佳实践 : How to get several dependency repositories into a ActionController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127932/