多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中获取资源:
- 可通过配置或注册顺序定义优先级(比如读写Provider优先于只读Provider,因为可能包含最新更新的内容)
- 实现遍历查找逻辑:
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
相关产品推荐
相关产品推荐

