【问题标题】:Difference between implementing DI by extending DefaultControllerFactory vs implementing IDependencyResolver通过扩展 DefaultControllerFactory 实现 DI 与实现 IDependencyResolver 之间的区别
【发布时间】:2023-03-06 06:46:02
【问题描述】:

我们可以通过实现 IDependencyResolver 或扩展 DefaultControllerFactory 在 MVC 中进行 DI

我曾经认为这两种不同的做法没有太大区别。

但是,我正在完成我的 MVC 书,它让我实现了自己的 ControllerFactory(而不是扩展默认值),并且在 CreateController 方法中,它实际上具有:

(IController) DependencyResolver.Current.GetService(targetType);

所以看起来 DefaultControllerFactory 实际上使用了 DependencyResolver

两者之间一定有区别,我认为这只是让我感到困惑。

问题

1) 这本书是否让我使用依赖解析器来简化 CustomControllerFactory 的实现,而实际的 DefaultControllerFactory 不使用它?

2) 我很难理解这两个的目的。我曾经认为这只是实现 DI 的两种不同方式,但我越深入越觉得它们完全不同。看起来依赖解析器是所有控制器实例化的地方

3) 是否有尝试在两者之间进行选择的最佳实践?也许有一些优点和缺点?

编辑:为清楚起见,我决定上传整个 CreateController 方法:

  public IController CreateController(RequestContext requestContext, string controllerName)
  {
     Type targetType = null;

     switch (controllerName)
     {
        case "Product":
           targetType = typeof (ProductController);
           break;
        case "Customer":
           targetType = typeof (CustomerController);
           break;
        default:
           requestContext.RouteData.Values["controller"] = "Product";
           targetType = typeof (ProductController);
           break;
     }

     return targetType == null ? null : (IController) DependencyResolver.Current.GetService(targetType);
  }

【问题讨论】:

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


    【解决方案1】:

    坚持DefaultControllerFactory

    IDependencyResolver is an example of the Service Locator anti-pattern,并且 IMO 应该从未添加到 MVC(或 Web API,就此而言)。虽然很多人混淆了Service Location和Dependency Injection,其实是two extremely different attempts to solve some common problems related to programming to interfaces

    但是,当您权衡 Service Locator 与 DI 的优缺点时,您会发现 Service Locator 确实是一种反模式,因为它带来的问题远远多于它解决的问题。虽然它声称解决了一些问题,但它实际上并没有解决任何 DI 无法更好地解决的问题。

    【讨论】:

    • 当然,只有当你允许它渗透到你的架构中时,它才会成为一种反模式。作为一个为了依赖注入而预先填充服务的集合,它的存在很好。糟糕的是,每一层代码都使用这种查找来查找服务。我见过使用 IDR 作为设置对象类型和生命周期的地方的实现,但是这些对象和所有其他对象都使用参数化构造函数并且不引用服务定位器。
    • @Quibblesome 写的东西似乎是有道理的,扩展 DefaultControllerFactory 相对于实现 IDependencyResolver 有什么优势,如果我们正确使用它并且不在我们的代码中的其他地方使用 DependencyResolver,除了对于 Global.asax?
    • @BornToCode 如果你像你写的那样做,你只需要扩展DefaultControllerFactory。那么,既然如此,为什么还要费心去实现IDependencyResolver呢?
    • @BornToCode 另请参阅blog.ploeh.dk/2014/05/19/conforming-container,了解为什么 Conforming Container 是一种反模式。
    • 您获得了创建顺序的棘手问题的自动化,并且您失去了执行初始化的笨重程序代码。然而,成本是在调试/故障排除时代码不太清楚,因为它不存在。它不认为事物只是“反模式”,它们有取舍,只是短期利益在大多数情况下不值得。
    猜你喜欢
    • 2023-04-11
    • 2014-04-29
    • 2021-09-19
    • 2014-08-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多