You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:30:45