ASP.NET 5中的dependency injection和对象处理

任何人都可以帮助我理解Asp.Net 5中的dependency injection和对象配置的上下文。

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

 public void ConfigureServices(IServiceCollection services) { services.AddTransient(); services.AddScoped(); services.AddSingleton(); services.AddInstance(); } 

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

有4种不同的生命周期:

短暂的

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

作用域

每个请求创建一次Scoped生命周期服务。

独生子

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

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

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


文档没有提到dependency injection服务如何处理依赖关系生存期,但是如果在代码中搜索,您将找到管理生命周期的ServiceProvider类: ServiceManager类

更具体地说,当创建范围时, 服务范围工厂返回一个新的服务范围,该范围与服务提供者实例化。 当dependency injection服务必须处理服务时,他调用服务范围的dispose方法 ,该方法调用服务提供者的dispose方法 。

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

您在此处拥有所有源代码: dependency injection源代码