c# - 最佳实践 : How to get several dependency repositories into a ActionController?

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

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

相关文章:

c# - 获取正在运行的应用程序的屏幕

javascript - 在 html 表中补充池

asp.net-mvc - MVC 是否可以在模型中访问 HttpContext.Current.User 以及如何测试

c# - 如何将 IFormFile 传递到我的服务层?

.net - 为什么 MEF 不是 DI/IoC 容器?

c# - C#/.net 可以从字符串中解析指数十六进制编码的 float 吗?

c# - 在 open xml c# 中为字符范围添加字符间距

c# - 如何处理 Entity Framework 中的陈旧缓存?

ios - 使用 CoreData 和依赖注入(inject) - 线程 1 : Fatal error: init(coder:) has not been implemented

java - JUnit 测试类中的设计依赖项