C# 使用带有Microsoft.Extensions.DependencyInjection库的服务进行依赖项注入
为什么在第二次创建范围后未调用ScopedOperation构造函数 资料来源: 添加服务:C# 使用带有Microsoft.Extensions.DependencyInjection库的服务进行依赖项注入,c#,dependency-injection,service-provider,C#,Dependency Injection,Service Provider,为什么在第二次创建范围后未调用ScopedOperation构造函数 资料来源: 添加服务: var serviceProvider = new ServiceCollection() .AddTransient<TransientOperation>() //Create a Simple Transient Service that writes a text on creation .AddScoped<S
var serviceProvider = new ServiceCollection()
.AddTransient<TransientOperation>() //Create a Simple Transient Service that writes a text on creation
.AddScoped<ScopedOperation>() //Create a Simple Scoped Service that writes a text on creation
.AddSingleton<SingletonOperation>() //Create a Simple Singleton Service that writes a text on creation
显示全部结果:
注意,在第二个请求中,瞬态服务构造函数是
调用,但我还希望ScopedService构造函数也被调用
调用,因为它位于不同的作用域中。为什么不叫它
//为什么不调用作用域服务和临时服务的已处理方法
您的示例的提供程序未被处置,因此其创建的服务也不会被处置。示例中的所有GetService
调用都属于同一范围
使用所创建范围的提供程序获取所需的行为
//...
using (IServiceScope scope = serviceProvider.CreateScope()) {
var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();
var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();
var transientService = scope.ServiceProvider.GetService<TransientOperation>();
}
//...
//为什么不调用作用域服务和临时服务的已处理方法
您的示例的提供程序未被处置,因此其创建的服务也不会被处置。示例中的所有GetService
调用都属于同一范围
使用所创建范围的提供程序获取所需的行为
//...
using (IServiceScope scope = serviceProvider.CreateScope()) {
var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();
var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();
var transientService = scope.ServiceProvider.GetService<TransientOperation>();
}
//...
Console.WriteLine("\n-------- Second Request --------");
using (var scope = serviceProvider.CreateScope()) //adding the same singleton, scope and transient services agains
{
var singletonService = serviceProvider.GetService<SingletonOperation>();
var scopedService = serviceProvider.GetService<ScopedOperation>();
var transientService = serviceProvider.GetService<TransientOperation>();
} //Why the disposed methods of Scoped and Transient Services are not being called ?
Console.WriteLine();
Console.WriteLine(new String('-',30));
Console.WriteLine("Operations Concluded!");
Console.ReadLine();
}
}
//DEFINING THE SERVICES
public class SingletonOperation:IDisposable
{ private bool _disposed = false;
public SingletonOperation() => Console.WriteLine("Singleton Service created!");
public void Dispose() { if (_disposed) return; Console.WriteLine("SingletonService Disposed!"); _disposed = true;}
~SingletonOperation() => Dispose();
}
public class ScopedOperation:IDisposable
{
private bool _disposed = false;
public ScopedOperation() => Console.WriteLine("Scoped Service created!");
public void Dispose() { if (_disposed) return; Console.WriteLine("ScopedService Disposed!");_disposed = true; }
~ScopedOperation()=>Dispose();
}
public class TransientOperation:IDisposable
{ private bool _disposed = false;
public TransientOperation() => Console.WriteLine("Transient Service created!");
public void Dispose(){ if (_disposed) return; Console.WriteLine("TransientService Disposed!"); _disposed = true; }
~TransientOperation() => Dispose();
}
//...
using (IServiceScope scope = serviceProvider.CreateScope()) {
var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();
var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();
var transientService = scope.ServiceProvider.GetService<TransientOperation>();
}
//...
Initiating Service Operations
-------- First Request --------
Singleton Service created!
Scoped Service created!
Transient Service created!
TransientService Disposed!
ScopedService Disposed!
Executing DemoService Operation number: 0
Executing DemoService Operation number: 1
Initialized valued on service was: 10
Adding object of type Client
I am Service A
I am Service B
I am Service B
-------- Second Request --------
Scoped Service created!
Transient Service created!
TransientService Disposed!
ScopedService Disposed!
------------------------------
Operations Concluded!