基于Finbuckle的多租户单库Blazor服务端应用分布式缓存错误修复
错误分析与修复方案
错误原因
- 全局服务容器污染:你在
CacheResolver的工厂方法内直接调用services.Configure和services.AddTransient,这会修改全局服务容器配置——所有租户会共享最后一次设置的连接字符串,且重复注册服务会引发容器异常。 - 委托类型不匹配:
CacheResolver委托定义要求返回IDistributedCache,但你的代码返回的是Func<IServiceProvider, IDistributedCache>,类型完全不符。
修复后的代码
直接基于传入的连接字符串创建租户独立的SqlServerCache实例,避免修改全局服务容器:
// 注册CacheResolver委托 services.AddTransient<CacheResolver>(sp => connectionString => { // 初始化当前租户的缓存配置选项 var cacheOptions = new SqlServerCacheOptions { ConnectionString = connectionString, SchemaName = "dbo", TableName = "Cache" }; // 从服务容器获取SqlServerCache所需的依赖(如日志组件) var logger = sp.GetRequiredService<ILogger<SqlServerCache>>(); // 直接创建当前租户专属的SqlServerCache实例 return new SqlServerCache(cacheOptions, logger); }); // 保持原委托定义不变 public delegate IDistributedCache CacheResolver(string connectionString);
修复逻辑说明
- 租户隔离:每个
CacheResolver调用都会根据传入的连接字符串创建独立的SqlServerCache实例,不会干扰其他租户的缓存配置。 - 类型匹配:直接返回
IDistributedCache类型实例,完全符合委托定义要求。 - 避免全局污染:不再修改全局服务容器的配置或注册,彻底解决多租户场景下的配置冲突问题。
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

