Blazor 创建和注入 API Service 的方法

月夜之吻
发布: 2025-12-14 12:54:08
原创
526人浏览过
Blazor中创建和注入API Service的核心是定义接口与实现类封装HTTP调用,通过DI注册(WebAssembly用Singleton、Server用Scoped),并在OnInitializedAsync中异步调用;需注意HttpClient配置、CORS、生命周期匹配及错误处理。

blazor 创建和注入 api service 的方法

在 Blazor 中创建和注入 API Service 的核心是:定义服务类封装 HTTP 调用,通过依赖注入(DI)注册到服务容器,并在组件中按需使用。关键在于区分服务生命周期、正确处理异步、适配 Blazor Server 与 WebAssembly 的差异。

定义 API Service 类

新建一个 C# 类(如 WeatherForecastService.cs),继承 IWeatherForecastService 接口(推荐,利于测试和解耦)。内部使用 IHttpClientFactory 或直接注入 HttpClient(WebAssembly 下需注意配置)。

示例:

public interface IWeatherForecastService<br>{<br>    Task<WeatherForecast[]> GetForecastAsync(DateTime startDate);<br>}<br><br>public class WeatherForecastService : IWeatherForecastService<br>{<br>    private readonly HttpClient _httpClient;<br><br>    public WeatherForecastService(HttpClient httpClient)<br>    {<br>        _httpClient = httpClient;<br>        _httpClient.BaseAddress = new Uri("https://localhost:5001/"); // WebAssembly 需确保跨域或代理<br>    }<br><br>    public async Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)<br>    {<br>        return await _httpClient.GetFromJsonAsync<WeatherForecast[]>($"WeatherForecast?startDate={startDate:O}");<br>    }<br>}
登录后复制

在 Program.cs 中注册服务

Blazor 从 .NET 6 起统一使用 Program.cs 配置 DI 容器。根据部署模型选择注册方式:

  • Blazor WebAssembly(托管或独立):注册为 Singleton,并配置 HttpClient 的基础地址和默认请求头
  • Blazor Server:通常注册为 Scoped(配合 SignalR 生命周期),也可用 Singleton

示例(WebAssembly):

builder.Services.AddHttpClient<IWeatherForecastService, WeatherForecastService>(<br>    client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));<br>// 或手动注册(更灵活)<br>builder.Services.AddSingleton<IWeatherForecastService, WeatherForecastService>();<br>builder.Services.AddScoped(sp => new HttpClient<br>{<br>    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)<br>});
登录后复制

在组件中注入并调用

使用 @inject 指令或构造函数注入。注意 Blazor 组件生命周期中,异步初始化需放在 OnInitializedAsync 中,避免在构造函数中执行异步操作。

ZipMarket数字内容/素材交易网站
ZipMarket数字内容/素材交易网站

ZipMarket程序仿自Envato旗下网站,对于想创建数字内容/素材交易平台的站长来说,ZipMarket是一个十分独特和极具创新的解决方案,用户在你的网站注册并购买或出售数字内容/素材作品时,你可以获得佣金;用户推广用户到你的网站购买或出售数字内容/素材时,引入用户的用户也可以获得佣金。实际上,ZipMarket是一套完美的数字内容类自由职业生态系统,功能不仅限于素材交易,除了模板/主题、文

ZipMarket数字内容/素材交易网站 0
查看详情 ZipMarket数字内容/素材交易网站

示例(.razor 文件):

@page "/forecast"<br>@using MyApp.Services<br>@inject IWeatherForecastService ForecastService<br><br><h3>Weather Forecast</h3><br><br>@if (forecasts == null)<br>{<br>    <p><em>Loading...</em></p><br>}<br>else<br>{<br>    <table class="table"><br>        <thead><tr><th>Date</th><th>Temp. (C)</th><th>Summary</th></tr></thead><br>        <tbody><br>            @foreach (var forecast in forecasts)<br>            {<br>                <tr><td>@forecast.Date.ToShortDateString()</td><td>@forecast.TemperatureC</td><td>@forecast.Summary</td></tr><br>            }<br>        </tbody><br>    </table><br>}<br><br>@code {<br>    private WeatherForecast[]? forecasts;<br><br>    protected override async Task OnInitializedAsync()<br>    {<br>        forecasts = await ForecastService.GetForecastAsync(DateTime.Now);<br>    }<br>}
登录后复制

处理常见问题

实际开发中容易遇到以下情况:

  • CORS 报错(WebAssembly)后端需启用跨域,或使用 dev-server 代理proxy.conf.js 或 .NET 6+ 的 appsettings.Development.json 代理配置)
  • HttpClient 实例复用问题:不要在服务中 new HttpClient;优先用 IHttpClientFactory 或由 DI 提供的实例
  • 认证与 Token 注入:可扩展 DelegatingHandler(如 AuthorizationMessageHandler)自动附加 JWT
  • 错误统一处理:在 Service 方法内捕获 HttpRequestException,转换为业务异常或返回 Result 封装类型

基本上就这些。不复杂但容易忽略细节,比如生命周期匹配、HttpClient 配置位置、以及 WebAssembly 下的 BaseAddress 来源。保持接口抽象、合理注册、异步生命周期对齐,API 调用就能稳定工作。

以上就是Blazor 创建和注入 API Service 的方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号