【问题标题】:Dependency injection using Services with Microsoft.Extensions.DependencyInjection library使用带有 Microsoft.Extensions.DependencyInjection 库的服务进行依赖注入
【发布时间】:2021-04-09 17:01:06
【问题描述】:

为什么在创建第二个作用域后没有调用 ScopedOperation 构造函数?

来源:https://dotnetfiddle.net/wtyP9n

using System;
using Microsoft.Extensions.DependencyInjection;
                    
public class Program
{
    public static void Main()
    {

添加服务:

        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

构建服务并发出第一个请求:

         serviceProvider.BuildServiceProvider();
        
         Console.WriteLine("Initiating Service Operations");
        
         Console.WriteLine("\n-------- First Request --------");    
        
        //With the scope the aim is to see if after the using(), which service will be destroyed
         using (var scope = serviceProvider.CreateScope())
         {
            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("\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();
}

显示完整结果:

观察到在第二个请求中,Transient Service 构造函数是 调用,但我也期待 ScopedService 构造函数 调用,因为它在不同的范围内。为什么不叫呢?

【问题讨论】:

    标签: c# dependency-injection service-provider


    【解决方案1】:

    //为什么没有调用Scoped和Transient Services的disposed方法?

    您的示例的提供者没有被释放,因此它创建的服务也不会被释放。您示例中的所有 GetService 调用都属于同一范围。

    使用创建的范围的提供者来获得所需的行为

    //...
    
    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!
    

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2017-06-12
      相关资源
      最近更新 更多