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,每个用户独立计数更合理。选错生命周期可能导致数据污染或内存泄漏。
基本上就这些。不复杂但容易忽略注册步骤和生命周期选择。










