[英].NET CORE dependency injection passing parameter to constructor
我正在嘗試使用 DI 注冊一個定義如下的類:
public class MyService
{
private string _serviceAddress;
public MyService(string serviceAddress)
{
_serviceAddress = serviceAddress;
}
public void DoWork()
{
// do work
}
}
在 program.cs 中,用 DI 注冊它:
builder.Services.AddSingleton<MyService>(new MyService(serviceAddress));
在 razor 組件中,注入它:
[Inject]
MyService myService { get; set; }
public WeatherForecast()
{
myService.DoWork(); // <- error points to this line
}
並且在訪問頁面時,得到了NullReferenceException,指向上面的DoWork行:
未處理的異常呈現組件:調用目標已拋出異常。 System.Reflection.TargetInvocationException:調用目標拋出異常。 ---> System.NullReferenceException:對象引用未設置為對象的實例。
任何建議表示贊賞。
您不能在組件構造函數中使用[Inject]
服務。 該屬性/服務尚未初始化。 您應該在組件初始化中完成這項工作:
[Inject]
MyService myService { get; set; }
public WeatherForecast()
{
// myService is null here. It hasn't been initialized.
// How could it be? We are currently constructing this object!
}
protected override Task OnInitializedAsync()
{
// myService has been initialized by this point.
// You can safely use it now.
myService.DoWork();
return base.OnInitializedAsync();
}
支持安迪的回答:
渲染器管理組件的生命周期。 服務在實例化組件實例后由渲染器注入組件實例。 如果找不到匹配的服務,它將拋出異常。
在可空環境中聲明注入屬性的正常方法是:
[Inject] MyService myService { get; set; } = default!;
如果您在 Razor 文件中使用@inject
,它會關閉特定聲明的可為 null 的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.