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

多Provider本地化系统设计难题:如何整合读写与只读Provider?

多Provider本地化系统整合方案

一、Provider的统一存储与管理

在核心类LocalizerManager中维护两个集合,分别管理只读和读写类型的Provider,同时提供注册方法完成Provider的初始化加载:

  • 定义内部集合:
    private readonly List<ILocalizerProvider> _readOnlyProviders = new();
    private readonly List<ILocalizerManagerProvider> _readWriteProviders = new();
    
  • 对外暴露注册接口:
    public void RegisterReadOnlyProvider(ILocalizerProvider provider)
    {
        _readOnlyProviders.Add(provider);
    }
    
    public void RegisterReadWriteProvider(ILocalizerManagerProvider provider)
    {
        _readWriteProviders.Add(provider);
    }
    
  • 系统启动阶段(比如DI容器注册时)完成所有Provider的注册,确保初始化完成后即可使用。

二、只读操作的多Provider协同逻辑

针对ILocalizer的只读方法(如GetString),采用优先级遍历策略从多Provider中获取资源:

  1. 可通过配置或注册顺序定义优先级(比如读写Provider优先于只读Provider,因为可能包含最新更新的内容)
  2. 实现遍历查找逻辑:
    public string GetString(string key, CultureInfo culture)
    {
        // 先查询读写Provider
        foreach (var provider in _readWriteProviders)
        {
            var value = provider.GetString(key, culture);
            if (!string.IsNullOrWhiteSpace(value))
                return value;
        }
        // 再查询只读Provider
        foreach (var provider in _readOnlyProviders)
        {
            var value = provider.GetString(key, culture);
            if (!string.IsNullOrWhiteSpace(value))
                return value;
        }
        return key; // 无匹配时返回key作为兜底
    }
    

三、读写操作的多Provider处理

读写操作仅针对读写类型Provider执行,可根据业务需求选择两种方案:

方案1:全量同步更新(多源数据一致场景)

对所有读写Provider执行相同的CRUD操作,确保数据同步:

public void SetString(string key, string value, CultureInfo culture)
{
    foreach (var provider in _readWriteProviders)
    {
        provider.SetString(key, value, culture);
    }
}

public void DeleteString(string key, CultureInfo culture)
{
    foreach (var provider in _readWriteProviders)
    {
        provider.DeleteString(key, culture);
    }
}

方案2:主Provider更新(单源权威场景)

指定一个主Provider作为数据权威源,仅对其执行读写操作,其他读写Provider可通过异步任务同步数据:

private ILocalizerManagerProvider _mainProvider;

public void SetMainProvider(ILocalizerManagerProvider provider)
{
    _mainProvider = provider;
    if (!_readWriteProviders.Contains(provider))
        _readWriteProviders.Add(provider);
}

public void SetString(string key, string value, CultureInfo culture)
{
    _mainProvider?.SetString(key, value, culture);
    // 异步同步到其他读写Provider
    Task.Run(() =>
    {
        foreach (var provider in _readWriteProviders.Where(p => p != _mainProvider))
        {
            provider.SetString(key, value, culture);
        }
    });
}

四、Provider生命周期管理

  • 给ILocalizerProvider和ILocalizerManagerProvider添加Initialize()方法,用于完成Provider的初始化(如数据库连接建立、嵌入式文件资源加载)
  • 在LocalizerManager中统一触发初始化:
    public void InitializeAllProviders()
    {
        foreach (var provider in _readOnlyProviders)
            provider.Initialize();
        foreach (var provider in _readWriteProviders)
            provider.Initialize();
    }
    

五、性能与扩展性优化

  • 给Provider添加Priority属性,支持按优先级排序后遍历查找资源
  • 引入内存缓存,缓存已读取的资源,在执行读写操作时清除对应key的缓存,减少底层Provider的访问次数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:35:10