簡體   English   中英

具有多個參數的構造函數的依賴注入解析,其值在運行時確定 .NET Core 3

[英]Dependency Injection resolution with constructors having multiple parameters whose values are determined at runtime .NET Core 3

作為對早先問題( 從 Class Libary .NET Core 3 中的非控制器類訪問 ILogger )的回復,我們可以將依賴類注入到控制器中。 DI 容器在啟動時解決對瞬態服務注冊的依賴。 因此,如果 ClassA 由 Controller 實例化,作為這種機制的結果,我們可以訪問 Class A 中的 ILogger。

原始問題代碼示例:

public class Startup
{
    ...

    public void ConfigureServices(IServiceCollection services)
    {      
        services.AddLogging();
        services.AddTransient<ClassX>();

        ...
    }
}

public class ControllerB : ControllerBase
{
    private readonly ClassX classX;
    private readonly ILogger logger;

    public ControllerB(ClassX classX, ILogger<ControllerB> logger)
    {
        this.classX = classX;
        this.logger = logger;
    }

    ...
}

public class ClassX
{
   private readonly ILogger logger;

   public ClassX(ILogger<ClassX> logger)
   {
       this.logger = logger;
   }
}

現在我有一個如下場景,其中ClassX的構造函數有多個參數:

public class ClassX
{
    private readonly ILogger logger;
    private int _num1;

    public ClassX(ILogger<ClassX> logger, int num1)
    {
        this.logger = logger;
        this.num1 = num1;
    }
}

ClassX構造函數通過[ActivatorUtilitiesConstructor]提供給 .NET Core DI 容器:

[ActivatorUtilitiesConstructor]
public ClassX(int num)
{
    this.constructorNum = num;
}

所以我們需要在啟動時DI解析期間注入構造函數參數。 我試過這個

services.AddTransient<Func<int, ClassX>>((provider) =>
{
    return new Func<int, ClassX>((numParam) => new ClassX(numParam));
});

但這會引發錯誤,因為我們沒有傳遞 ILogger。

如何在運行時通過 DI 注入 ILogger 以及構造函數參數?

對於這種情況,您可以使用傳遞到工廠函數的provider參數來解析 IoC 容器中的ILogger<ClassX>實例:

services.AddTransient<Func<int, ClassX>>((provider) =>
{
    return new Func<int, ClassX>((numParam) =>
        new ClassX(provider.GetRequiredService<ILogger<ClassX>>(), numParam));
});

這里的providerIServiceProvider一個實現。 此示例使用擴展方法GetRequiredService來檢索ILogger<ClassX>的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM