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

时间:2016-02-19 06:37:08

标签: 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>();
}         

1 个答案:

答案 0 :(得分:4)

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

有4种不同的生命周期:

<强>瞬态

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

<强>作用域

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

<强>的Singleton

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

<强>实例

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

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

文档没有提到依赖注入服务如何处理依赖关系的生命周期,但是如果你在代码中搜索,你会找到管理生命周期的 ServiceProvider 类: ServiceManager class

更具体一点,当创建范围时,service scope factory返回一个新的服务范围,该范围与服务提供者实例化。当依赖注入服务必须处理服务时,他会调用调用service scope's dispose methodservice provider's dispose method

服务提供商如何运作?他拥有属性中的所有服务范围,名为 _resolvedServices ,以及名为 _transientDisposables 的属性中的所有transiant一次性用品。当调用dispose() method of the service provider时,他会循环访问这两个属性中的所有项目,并为每个对象调用他的 dispose 方法。

您在此处拥有所有源代码:Dependency Injection source code