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

use*_*223 6 c# asp.net dependency-injection asp.net-core-mvc

任何人都可以帮助我理解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>();
}         
Run Code Online (Sandbox Code Playgroud)

Adr*_*ris 4

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

\n\n

有 4 种不同的生命周期:

\n\n

短暂的

\n\n

每次请求时都会创建瞬态生命周期服务。此生命周期最适合轻量级、无状态服务。

\n\n

范围

\n\n

每个请求都会创建一次范围内的生命周期服务。

\n\n

辛格尔顿

\n\n

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

\n\n

实例

\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n

更具体地说,当创建一个范围时,服务范围工厂会返回一个新的服务范围,该服务范围由服务提供者实例化。当依赖注入服务必须处置一个服务时,他调用服务范围的 dispose 方法,服务范围又调用服务提供者的 dispose 方法

\n\n

服务提供商如何运作?他在名为_resolvedServices 的属性中拥有所有服务范围,在名为_transientDisposables的属性中拥有所有瞬态可处置项。当服务提供者的 dispose() 方法被调用时,他会循环访问这两个属性中的所有项目,并为每个对象调用他的dispose方法。

\n\n

您在这里拥有所有源代码:依赖注入源代码

\n

  • 这个答案描述了服务何时创建。这个问题是他们什么时候处置。谁负责处置?DI 框架或注入服务的代码?如果是 DI 框架,它如何知道服务何时不再使用? (6认同)