任何人都可以帮助我理解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>();
}
答案 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 method的service provider's dispose method。
服务提供商如何运作?他拥有属性中的所有服务范围,名为 _resolvedServices ,以及名为 _transientDisposables 的属性中的所有transiant一次性用品。当调用dispose() method of the service provider时,他会循环访问这两个属性中的所有项目,并为每个对象调用他的 dispose 方法。
您在此处拥有所有源代码:Dependency Injection source code