Blazor Server中SessionStorageService依赖注入报错:ProtectedBrowserStorage未注册
Blazor Server中SessionStorageService依赖注入修复方案
问题原因
ProtectedBrowserStorage是Blazor Server存储服务的抽象基类,框架默认未将其注册到依赖注入容器,仅注册了它的两个具体实现:ProtectedLocalStorage(对应本地存储)和ProtectedSessionStorage(对应会话存储)。你试图注入未注册的抽象类,因此返回null并触发报错。
修复步骤
1. 调整SessionStorageService构造函数
如果你的服务用于管理会话存储,直接依赖ProtectedSessionStorage而非抽象的ProtectedBrowserStorage:
public class SessionStorageService { private readonly ProtectedSessionStorage _protectedSessionStorage; // 若需操作本地存储,替换为ProtectedLocalStorage public SessionStorageService(ProtectedSessionStorage protectedSessionStorage) { _protectedSessionStorage = protectedSessionStorage; } // 你的存储操作方法... }
2. 更新program.cs中的服务注册
简化注册逻辑,让DI自动解析具体服务:
builder.Services.AddScoped<SessionStorageService>();
若需手动实例化(仅针对特殊场景):
builder.Services.AddScoped<SessionStorageService>(x => new SessionStorageService(x.GetRequiredService<ProtectedSessionStorage>()));
可选:手动注册ProtectedBrowserStorage(不推荐)
若坚持使用抽象基类,需手动将具体实现映射到抽象类:
// 注册会话存储版本的ProtectedBrowserStorage builder.Services.AddScoped<ProtectedBrowserStorage, ProtectedSessionStorage>(); // 若需本地存储版本,替换为: // builder.Services.AddScoped<ProtectedBrowserStorage, ProtectedLocalStorage>(); // 之后可正常注入ProtectedBrowserStorage builder.Services.AddScoped<SessionStorageService>(x => new SessionStorageService(x.GetService<ProtectedLocalStorage>(), x.GetService<ProtectedBrowserStorage>()));
关键说明
- Blazor Server中操作会话存储优先用
ProtectedSessionStorage,操作本地存储用ProtectedLocalStorage,二者均为框架预注册服务,无需额外配置。 - 避免依赖未注册的抽象类,优先使用框架提供的具体实现类,减少不必要的DI配置成本。
内容的提问来源于stack exchange,提问作者IYM
相关产品推荐
相关产品推荐

