ASP.NET 5 中的依赖注入和对象处置

本文关键字:对象 注入 依赖 NET ASP | 更新日期: 2023-09-27 18:35:16

谁能帮助我理解以下内容在 Asp.Net 5 中的依赖注入和对象处置的上下文中。

我需要了解我的服务是否实现了IDispose接口,谁将调用 dispose 方法。

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IService, Service>();
    services.AddScoped<IService, Service>();
    services.AddSingleton<IService, Service>();
    services.AddInstance<IService, Service>();
}         

ASP.NET 5 中的依赖注入和对象处置

IServiceCollection 包含应用程序中可用的服务集。您可以定义要使用的服务及其生存期,应用程序将为您实例化和处置它们。

有4种不同的生命周期:

短暂的

每次请求临时生存期服务时都会创建这些服务。此生存期最适合轻量级无状态服务。

范围

每个请求创建一次作用域生存期服务。

单身 人士

第一次请求单一实例

生存期服务时会创建它们,然后每个后续请求将使用相同的实例。如果应用程序需要单一实例行为,建议允许服务容器管理服务的生存期,而不是实现单一实例设计模式并在类中自行管理对象的生存期。

实例

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

asp.net 5官方文档很棒,请花点时间阅读:http://docs.asp.net/en/latest/fundamentals/dependency-injection.html


该文档没有提到依赖注入服务如何处理依赖项生存期,但如果您在代码中搜索,您将找到管理生存期的 ServiceProvider 类: 服务管理器类

更具体地说,创建作用域时,服务作用域

工厂返回一个新的服务作用域,该服务作用域与服务提供者一起实例化。当依赖注入服务必须释放服务时,他调用服务范围的 dispose 方法,后者调用服务提供者的 dispose 方法。

服务提供商如何运作?他在名为 _resolvedServices 的属性中拥有所有服务范围,在名为 _transientDisposables 的属性中拥有所有暂时性一次性用品。当调用服务提供者的 dispose() 方法时,他循环他在这两个属性中的所有项目,并为每个对象调用他的 dispose 方法。

这里有所有的源代码:依赖注入源代码