[英]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 是已經注冊的類或接口,則
此鏈必須由 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.