为什么要在内置的ASP.NET Core DI容器上使用第三方DI容器?

目前缺乏关于DI主题 – dependency injection的文档。 有人可以帮我理解以下几点:

  1. 这些注册有什么区别?

    public void ConfigureServices(IServiceCollection services) { services.AddTransient<IService, Service>(); services.AddScoped<IService, Service>(); services.AddSingleton<IService, Service>(); services.AddInstance(service); } 
  2. (NInject,Autofac,Structure Map)等现有解决scheme使用内置DI的优缺点是什么?
  3. 什么是当前的默认dependency injection(如果有的话)的限制?

对于遵循SOLID原则的任何相当大的应用程序的产品开发,vNext的内置DI容器将是无用的,因为:

  • 它不会帮助您validation您的configuration,因此很难诊断常见错误configuration(例如, Captive Dependencies)带来的问题 。 在一个合理大小的应用程序中,实际上很难自己发现这些错误。
  • 使用拦截器或装饰器来应用交叉关注是不可能的。 这使得维护任何合理大小的应用程序都非常昂贵。
  • 虽然它支持将开放generics抽象映射到开放generics实现,但它不能使用带有types约束的genericstypes。
  • 要进行条件注册是不可能的,注册只能注入一定的消费者。

如果您从一个新的简单的项目开始,我的build议是应用Pure DI (意味着不使用容器的手持式组件),并通过插入您的自定义IControllerActivator来解决您的types。 稍后,当批注册和修饰等function将改进组合根目录的可维护性时,请切换到适合您要求的其中一个已build立的DI库。

这里解释:

  • 瞬态 – 每次创build一个新的实例
  • 作用域 – 在当前作用域内创build一个实例。 它相当于当前范围内的Singleton
  • Singleton – 创build一个实例,它就像一个单例
  • 实例 – 一个特定的实例被一直给予。 您对其初始创作负责

Alpha版本有这样的限制:

  • 它只支持构造函数注入
  • 它只能用一个公共的构造函数来parsingtypes
  • 它不支持高级function(如每个线程范围或自动发现)

如果你没有写出真正复杂的产品默认DI容器应该足够你。 在其他情况下,您可以尝试已经提到的具有高级function的库。

我的build议是从默认的开始,当(如果)你碰到不能用它做的事情时改变实现。

这些注册有什么区别?

  • 瞬时 – 每次请求时实例化
  • 作用域 – 每个请求实例化一次,并在请求的生存期内可用
  • 单例 – 实例化一次,并可用于整个应用程序的整个生命周期
  • 实例 – 相当于单例,除了提供对象实例而不是创build实例的框架

资料来源: http : //www.khalidabuhakmeh.com/asp-vnext-dependency-injection-lifecycles,http : //dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-喷射式-6-步骤/

为了回答你的第一个问题:似乎ASP.NET文档已经更新,现在清楚地说明了每种types的注册:

可以使用以下生命周期来configurationASP.NET服务:

短暂的

每次请求时都会创build瞬态生命周期服务。 这个生命周期最适合轻量级的无状态服务。

作用域

作用域生命期服务每个请求创build一次。

独生子

单例生命期服务在第一次请求时被创build,然后每个后续请求将使用相同的实例。 如果您的应用程序需要单例行为,则build议允许服务容器pipe理服务的生命周期,而不是实现单例devise模式,并自己pipe理对象的类生命周期。

实例 [仅限RTM前!]

您可以select直接将实例添加到服务容器。 如果你这样做,这个实例将被用于所有后续的请求(这种技术将创build一个单一范围的实例)。 实例服务和Singleton服务之间的一个主要区别是实例服务在ConfigureServices中创build,而Singleton服务在第一次请求时被延迟加载。


在RTM中更新

请注意,在Asp.Net Core RTM文档实例已被删除。 实例与Singleton基本上是一样的,但是它们有不同的初始化语义(Singleton被延迟加载)。 但是现在没有AddInstance API,只有AddSignleton可以使用已经创build的实例。