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

基于Finbuckle的多租户单库Blazor服务端应用分布式缓存错误修复

错误分析与修复方案

错误原因

  1. 全局服务容器污染:你在CacheResolver的工厂方法内直接调用services.Configure和services.AddTransient,这会修改全局服务容器配置——所有租户会共享最后一次设置的连接字符串,且重复注册服务会引发容器异常。
  2. 委托类型不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:24