簡體   English   中英

.NET CORE 依賴注入將參數傳遞給構造函數

[英].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.

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