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

如何创建可在Blazor项目各模块(含RCL)共享且会话独立的服务

实现满足要求的Blazor UserService

1. 改造UserService,添加实时变更通知

要实现跨模块数据同步,需为服务添加属性变更通知机制,让所有使用该服务的组件能感知数据变化:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class UserService : INotifyPropertyChanged
{
    private User? _currentUser;

    public User? CurrentUser
    {
        get => _currentUser;
        set
        {
            if (_currentUser != value)
            {
                _currentUser = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler? PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public class User
    {
        public string Name { get; set; } = string.Empty;
        public Guid SessionId { get; set; }
    }
}

2. 注册Scoped生命周期服务

在主项目ServiceTestBlazorServerApp的Program.cs中注册服务,确保每个客户端会话拥有独立实例:

builder.Services.AddScoped<UserService>();

3. 跨模块统一使用服务

不管是主项目还是MainRazorClassLibrary、UserRazorClassLibrary等RCL,使用方式和单项目完全一致:

在Razor组件中注入并监听变更

@inject UserService UserService
@implements IDisposable

<div>当前用户:@UserService.CurrentUser?.Name</div>
<button @onclick="UpdateUser">更新用户</button>

@code {
    protected override void OnInitialized()
    {
        UserService.PropertyChanged += UserChangedHandler;
        // 初始化会话专属数据
        if (UserService.CurrentUser == null)
        {
            UserService.CurrentUser = new UserService.User
            {
                Name = "新会话用户",
                SessionId = Guid.NewGuid()
            };
        }
    }

    private void UserChangedHandler(object? sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(UserService.CurrentUser))
        {
            StateHasChanged(); // 触发组件刷新,实现实时同步
        }
    }

    private void UpdateUser()
    {
        UserService.CurrentUser = new UserService.User
        {
            Name = $"用户_{DateTime.Now:HHmmss}",
            SessionId = UserService.CurrentUser!.SessionId
        };
    }

    public void Dispose()
    {
        UserService.PropertyChanged -= UserChangedHandler;
    }
}

4. 确保跨模块访问一致性

  • 将UserService放在独立的共享类库中,让主项目和所有RCL都引用这个类库;若必须放在某个RCL中,确保其他模块都引用该RCL
  • 所有模块使用的服务类型完全一致,依赖注入可正常解析

内容的提问来源于stack exchange,提问作者Kobra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:02:31