为什么会在内置的ASP.NET Core DI Container上使用第三方DI Container?

And*_*ren 40 asp.net dependency-injection asp.net-core

目前缺乏关于DI主题的文档 - 依赖注入.有人可以帮我理解以下内容:

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

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IService, Service>();
        services.AddScoped<IService, Service>();
        services.AddSingleton<IService, Service>();
        services.AddInstance(service);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用内置DI优于现有解决方案(NInject,Autofac,Structure Map)的优缺点是什么?
  3. 默认依赖注入的当前限制是什么(如果有的话)?

Ste*_*ven 48

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

  • 它无法帮助您验证配置,因此很难诊断常见错误配置导致的问题.在一个合理大小的应用程序中,实际上很难自己发现这些错误.
  • 使用拦截器或装饰器以可维护的方式应用横切关注点是不可能的.这使得维护任何合理大小的应用程序非常昂贵.
  • 虽然它支持将开放式通用抽象映射到开放式泛型实现,但它的实现相当幼稚,无法使用具有类型约束的泛型类型和更复杂的泛型类型映射.
  • 以这种方式进行有条件注册是不可能的,即注册只会被注入某一组消费者.

如果您从一个新的简单项目开始,我的建议是应用Pure DI(这意味着不使用容器的手工连接组件)并通过插入自定义IControllerActivator来解决您的类型.稍后,当批量注册和装饰等功能可以提高组合根的可维护性时,请切换到符合您要求的已建立的DI库之一.

  • @Legends.是的.这个答案仍然适用于.NET Core 2.0. (3认同)
  • 在ASP.NET Core 2.0上仍然有效吗? (2认同)
  • 是的。这个答案仍然适用于 .NET Core 3.0。 (2认同)
  • 是的。.NET 5.0 仍然如此。 (2认同)

Mar*_* M. 18

这里解释说:

  • 瞬态 - 每次都会创建一个新实例
  • Scoped - 在当前范围内创建单个实例.它相当于当前范围内的Singleton
  • 单例 - 创建单个实例,它就像一个单例
  • 实例 - 始终提供特定实例.您负责其初始创建

Alpha版本有这个限制:

  • 它只支持构造函数注入
  • 它只能解析具有一个且只有一个公共构造函数的类型
  • 它不支持高级功能(如每个线程范围或自动发现)

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

我的建议是从默认的那个开始,并在(如果)遇到你无法用它做的事情时改变实现.


Mic*_*ael 6

这些注册有什么区别?

  • 瞬态 - 每次检索时都会实例化
  • Scoped - 每个http请求实例化一次,并且可以在http请求的生命周期内使用
  • 单例 - 实例化一次,将在应用程序的整个生命周期内可用
  • 实例 - 除了提供对象实例而不是创建实例的框架之外,等效于单例

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


Nic*_*kAb 5

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

可以使用以下生命周期配置ASP.NET服务:

短暂的

每次请求时都会创建瞬态生命周期服务.这种生命周期最适合轻量级,无状态服务.

作用域

每个请求创建一次范围生命周期服务.

独生子

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

实例 [仅限RTM!]

您可以选择将实例直接添加到服务容器中.如果这样做,此实例将用于所有后续请求(此技术将创建一个Singleton范围的实例).Instance服务和Singleton服务之间的一个关键区别是Instance服务是在ConfigureServices中创建的,而Singleton服务是在第一次请求时延迟加载的.


在RTM中更新

请注意,在Asp.Net Core RTM docs中删除了实例.实例与Singleton基本相同,但它们具有不同的初始化语义(Singleton是延迟加载的).但是现在没有AddInstance API,只有AddSignleton可以接受已经创建的实例.


归档时间:

查看次数:

10532 次

最近记录:

6 年,2 月 前