Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用带有Microsoft.Extensions.DependencyInjection库的服务进行依赖项注入_C#_Dependency Injection_Service Provider - Fatal编程技术网

C# 使用带有Microsoft.Extensions.DependencyInjection库的服务进行依赖项注入

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

为什么在第二次创建范围后未调用ScopedOperation构造函数

资料来源:

添加服务:

        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!