如何创建可在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
相关产品推荐
相关产品推荐

