asp.net - 为什么要使用第三方 DI 容器而不是内置 ASP.NET Core DI 容器?

标签 asp.net dependency-injection asp.net-core

目前缺乏有关 DI 主题的文档 - Dependency Injection 。与现有解决方案(Ninject、Autofac、StructureMap)相比,使用内置 DI 有何优点/缺点?默认依赖注入(inject)的当前限制是什么(如果有)?

最佳答案

对于任何实行松散耦合并遵循 SOLID 原则的合理规模应用程序的产品开发,.NET Core 的 DI 容器 (MS.DI) 不适合,因为:

  • 它无法帮助您验证配置,因此很难诊断常见错误配置带来的问题。在一个相当大小的应用程序中,您自己实际上很难发现这些错误。 更新:MS.DI 版本 3 现在包含一个名为 ValidateOnBuild 的功能,但它唯一做的就是检查所有注册的所有依赖关系是否都能得到满足。
  • 无法申请Cross-Cutting Concerns使用拦截器或 decorators以可维护的方式。这使得维护任何合理大小的应用程序都更加昂贵。 更新:有几个第三方库试图填补这一空白,但由于 MS.DI 的限制,它们无法完全填补该空白(例如,装饰开放通用注册、确保装饰实例的处置等)
  • 虽然 MS.DI 支持开放通用抽象到开放通用实现的映射,但其实现相当 naive并且无法使用具有类型约束、更复杂的泛型类型映射和方差的泛型类型。
  • impossible进行条件/上下文注册,在使用自动接线时,注册仅被注入(inject)到特定的一组消费者。例如当有两个组件时 Service1Service2两者都依赖于 ILogger ,您可能想注入(inject) Service1NullLoggerService2FileLogger ,或者你想要Service1注入(inject)Logger<Service1>Service2Logger<Service2> .

存在这些限制的主要原因是内置容器的目标是为框架本身提供 DI 功能,同时将其功能集保持在最低限度,以期更成熟的 DI 容器能够能够与之融为一体。换句话说,它尝试充当最小公分母 (LCD)。由于其 LCD 功能,它永远无法成长为可用于应用程序开发的成熟的 DI 容器(并非不违背作为 LCD 的 promise )。

如果您从一个新的简单项目开始,我的建议是申请 Pure DI 。这意味着您可以在 Composition Root 内手动连接组件。 使用容器并且创建您自己的 DI 容器。相反,您可以通过插入 your custom IControllerActivator 来解析您的类型。 。稍后,当自动接线、自动注册和拦截等功能可以提高您的组合根的可维护性时,请切换到符合您要求的已建立的 DI 库之一。

关于asp.net - 为什么要使用第三方 DI 容器而不是内置 ASP.NET Core DI 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681477/

相关文章:

java - Dagger 2 构建在单个 Inject 注释上失败

c# - ASP.Net Core 中间件无法设置异常状态码,因为 "response has already started"

c# - 如何将表数据存储在不会被删除的变量中

c# - ASP.NET 中的并发线程和锁

c# - 如何覆盖 Web Services .Net 中的 Wsdl 生成

dependency-injection - 运行注入(inject)代码的集成测试库的正确方法是什么?

c# - 如何使用具有简单注入(inject)器依赖项的 WPF 控件

c# - rc1.final 中的 User.Identity 中不存在 getUserId

c# - 当中间件管道尚未完成时,如何将响应 header 发送到客户端?

asp.net - iPad 上的 Chrome 无法与 ASP.NET 4 配合使用