簡體   English   中英

在普通 c# 代碼中訪問 blazor (wasm) 注入對象,而不是 razor 頁面

[英]Accessing blazor (wasm) injected objects in plain c# code as opposed to razor page

例如,模板生成的代碼有

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

並在此處使用此服務

@page "/fetchdata"
@inject HttpClient Http
...
protected override async Task OnInitializedAsync()
{
    forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
}

很好,但是我可以從普通的 c# 文件訪問該服務嗎?

我嘗試手動輸入@inject 生成的內容,但這似乎不起作用:-

[Inject]
HttpClient Http {get;set;};

編輯 - 綜合各種評論和答案的答案

當依賴項由 DI 系統實例化時,如果其構造函數具有 arguments 是已經注冊的類或接口,則

  • 如果尚未完成,這些依賴項本身會被實例化
  • 實例被傳遞給原始 dep 上的構造函數

此鏈必須由 blazor 頁面上某處的@inject / [inject]啟動。

所以舉我的例子。 如果我在名為 DbIo 的 class 中有一些代碼,則需要 HttpClient。 必須做

public class DbIo{
     HttpClient _http;
     // constructor effectively announcing the dependencies
     public DbIo(HttpClient _http){
         _http = http;
     }
}

添加

 builder.Services.AddScoped<DbIo>();

到program.cs,並添加(這是不明顯的位)

 @inject DbIo DbService

到 blazor 頁面(比如 App.razor)。 這會強制實例化 DbIo 實例,從而通過其構造函數傳遞其他服務。

我在使用 Blazor Wasm 時遇到了類似的問題。

我使用了一種解決方法,使用加載頁面並在 OnInitialized() 覆蓋方法中手動注入我需要的內容。

出於某種原因,這些標志在.cs 文件中不起作用,但它們總是在.razor 中起作用。 所以,我從 a.razor 頁面注入它們,就像“Setup(neededObject)”一樣。

這就是依賴注入的本質。 如果根 object 由 DI Container 提供,那么它可以解析所有構造函數參數,假設它們也注冊在 DI Container 中。

Razor 組件/頁面由 Blazor 框架提供,Blazor 框架負責解析注入的屬性(假設它們已在 DI 容器中注冊)。

builder.Services.AddScoped(sp => 
    new HttpClient 
    { 
        BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) 
    });

... 將 HttpClient 添加到 DI 容器。

當您的 FetchData 頁面由 Blazor 框架提供時,它將提供標有指令@inject的服務。 在這種情況下... HttpClient。

使用自定義服務...

如果您想在頁面和 HttpClient 之間使用服務以使頁面不直接使用 HttpClient,那么您需要在 DI 容器中注冊該服務。

builder.Services.AddScoped<MyCustomService>();

然后,在您的 razor 頁面中,您可以注入 MyCustomService:

@inject MyCustomService CustomService

現在 MyCustomService 由 DI 容器提供,它可以在其構造函數參數中請求 HttpClient(因為 HttpClient 也在 DI 容器中注冊):

public class MyCustomService
{
    readonly HttpClient _httpClient;
    
    public MyCustomService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
    
    public async Task ApiMethod()
    {
        await _httpClient.PostAsync( ..... );
    }
}

暫無
暫無

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

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