Blazor中如何实现服务间依赖注入?以DataService与StateContainer为例
实现方案与服务注册指南
核心思路:通过构造函数注入实现依赖访问
因为StateContainer已经是单例注册,最直接且符合依赖注入规范的方式是在DataService的构造函数中注入StateContainer实例,这样DataService就能直接访问其公开属性。
1. 定义服务类
StateContainer(已作为单例)
public class StateContainer { // 公开状态属性 public string CurrentFilter { get; set; } = string.Empty; // 可选:添加状态变更事件,让DataService能响应状态变化 public event Action? OnStateChanged; public void UpdateFilter(string newFilter) { CurrentFilter = newFilter; OnStateChanged?.Invoke(); } }
DataService
通过构造函数接收StateContainer,并使用其状态属性获取对应数据:
public class DataService { private readonly StateContainer _stateContainer; // 构造函数注入StateContainer public DataService(StateContainer stateContainer) { _stateContainer = stateContainer; // 可选:订阅状态变更事件,自动更新数据 _stateContainer.OnStateChanged += HandleStateChanged; } // 根据状态获取数据的方法 public async Task<List<DataItem>> GetFilteredDataAsync() { // 使用StateContainer的公开属性作为查询条件 var filter = _stateContainer.CurrentFilter; // 模拟根据filter获取数据的逻辑 return await FetchDataFromSource(filter); } private async Task<List<DataItem>> FetchDataFromSource(string filter) { // 实际数据获取逻辑(比如调用API、查询数据库) return new List<DataItem>(); } private void HandleStateChanged() { // 状态变更时的处理逻辑(比如清空缓存、重新获取数据) } // 可选:实现IDisposable,注销事件订阅 public void Dispose() { _stateContainer.OnStateChanged -= HandleStateChanged; } }
2. 服务注册
在你的依赖注入容器配置中(比如ASP.NET Core的Program.cs),按以下方式注册:
var builder = WebApplication.CreateBuilder(args); // StateContainer已注册为单例 builder.Services.AddSingleton<StateContainer>(); // 注册DataService:根据业务需求选择生命周期 // 场景1:如果DataService不需要维护自身状态,可注册为单例(和StateContainer生命周期一致) builder.Services.AddSingleton<DataService>(); // 场景2:如果每个请求需要独立的DataService实例,注册为作用域 // builder.Services.AddScoped<DataService>(); // 场景3:每次获取都创建新实例,注册为瞬时 // builder.Services.AddTransient<DataService>(); var app = builder.Build(); // ...后续配置
关键说明
- 构造函数注入是.NET依赖注入的标准方式,能确保依赖关系清晰、可测试。
- 由于
StateContainer是单例,无论DataService注册为哪种生命周期,都会拿到同一个StateContainer实例,保证状态一致性。 - 如果需要
DataService主动响应状态变化,通过事件订阅是简单可靠的方式,避免轮询状态。
内容的提问来源于stack exchange,提问作者Chris LAM
相关产品推荐
相关产品推荐

