17370845950

Blazor 怎么使用依赖注入
Blazor依赖注入分三步:定义服务接口及实现类、在Program.cs中按Singleton/Scoped/Transient注册、组件中用@inject或构造函数注入使用;需注意生命周期匹配业务需求以防数据污染或内存泄漏。

Blazor 使用依赖注入(DI)来解耦组件与服务,让服务的创建、生命周期管理和使用更清晰可控。核心就三步:定义服务接口和实现类 → 在 Program.cs 中注册服务 → 在组件中通过 @inject 或构造函数获取并使用。

定义服务接口和实现类

先写一个接口,明确服务能做什么;再写一个类实

现它。比如时间服务:

  • 接口定义(IDateTime.cs):
    public interface IDateTime { DateTime Now { get; } }
  • 实现类(SystemDateTime.cs):
    public class SystemDateTime : IDateTime { public DateTime Now => DateTime.Now; }

在 Program.cs 中注册服务

注册决定服务的生命周期和可用范围。Blazor 支持三种模式:

  • Singleton:整个应用共用一个实例(适合无状态工具类,如日志、配置读取器)
    builder.Services.AddSingleton();
  • Scoped:每个用户会话(Blazor Server)或每个浏览器标签页(Blazor WebAssembly)一个实例(适合需保持会话上下文的服务)
  • Transient:每次请求都新建实例(适合轻量、无共享状态的短期服务)

在组件中注入并使用服务

最常用方式是 @inject 指令,写在组件顶部即可:

  • @page "/counter"
    @inject IDateTime DateTimeService

    当前时间:@DateTimeService.Now

  • 也可以用构造函数注入(适合需要做初始化逻辑的场景):
    [Inject] public IDateTime DateTimeService { get; set; }

注意生命周期匹配实际需求

比如计数器服务若用 Singleton,所有用户会共享同一个计数值;若用 Scoped,每个用户独立计数更合理。选错生命周期可能导致数据污染或内存泄漏。

基本上就这些。不复杂但容易忽略注册步骤和生命周期选择。