![](/img/trans.png)
[英]Dependency Injection With Unity Using Constructors With Runtime Parameters
[英]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));
});
這里的provider
是IServiceProvider
一個實現。 此示例使用擴展方法GetRequiredService
來檢索ILogger<ClassX>
的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.