Dotnet选项模式的全球化与本地化
前言
选项模式 Options 是Dotnet非常重要的一个基础概念,在应用开发过程中很多Service都关联着其 Options。
我们有个AI Agent使用 Options 来配置AI的一部分功能,原需求是只需要支持英文语言,现需求改为要支持其它共6种语言。我决定开发一个类库,使 Options 完整地得到多语言支持。
设计思路
1 具体语言的Configuration
使用OptionsLocalization:{OptionsName}:{culture}做为配置的key前缀,例如AIOptions选项的ModelId属性,在配置里的zh-CN对应的key是OptionsLocalization:AIOptions:zh-CN:ModelId
2 简化的 json 配置文件
未简化前的 AIOptions/zh-CN.json
{
"OptionsLocalization": {
"AIOptions": {
"zh-CN": {
"ModelId": "gemini2.5",
"Prompt": "你好世界"
}
}
}
}
期待简化后的 AIOptions/zh-CN.json
{
"ModelId": "gemini2.5",
"Prompt": "你好世界"
}
3 语言区域别名化的 Options
// 选项绑定到别名化的配置
// 如果是默认语言区域,则注册成别名为Options.DefaultName
services.Configure<AIOptions>("zh-CN", configuration.GetSection("OptionsLocalization:AIOptions:zh-CN"));
// 使用别名获取选项
IOptionsMonitor<AIOptions>().Get("zh-CN");
4 支持父语言区域回退
假设注册"en"默认语言和zh语言
services.Configure<AIOptions>("zh", zhSection);
services.Configure<AIOptions>(Options.DefaultName, enSection);
现在前端的语言区域为"zh-CN",IOptionsMonitor<AIOptions>().Get("zh-CN")会存在以下问题:
zh-CN不存在,要回退到zh-Hanszh-Hans不存在,要回退到zhzh下的ModelId没有配置项,要回退使用默认的en下的ModelId项
我们需要实现自定义的IOptionsFactory<TOptions>,把指定的语言区域别名的AIOptions构建正确。
sealed class CultureOptionsFactory<TOptions> : IOptionsFactory<TOptions>
where TOptions : class, new()
{
private readonly IConfigureOptions<TOptions>[] _setups;
private readonly IPostConfigureOptions<TOptions>[] _postConfigures;
private readonly IValidateOptions<TOptions>[] _validations;
public CultureOptionsFactory(IEnumerable<IConfigureOptions<TOptions>> setups, IEnumerable<IPostConfigureOptions<TOptions>> postConfigures, IEnumerable<IValidateOptions<TOptions>> validations)
{
_setups = setups as IConfigureOptions<TOptions>[] ?? setups.ToArray();
_postConfigures = postConfigures as IPostConfigureOptions<TOptions>[] ?? postConfigures.ToArray();
_validations = validations as IValidateOptions<TOptions>[] ?? validations.ToArray();
}
public TOptions Create(string name)
{
var defaultOptions = this.CreateOptions(Options.DefaultName, default);
if (string.IsNullOrEmpty(name))
{
return defaultOptions;
}
var culture = CultureInfo.GetCultureInfo(name);
var cultureStack = new Stack<CultureInfo>();
cultureStack.Push(culture);
while (culture.Parent.Name.AsSpan().Length > 0)
{
culture = culture.Parent;
cultureStack.Push(culture);
}
var options = defaultOptions;
while (cultureStack.TryPop(out var next))
{
options = this.CreateOptions(next.Name, options);
}
return options;
}
private TOptions CreateOptions(string name, TOptions? options)
{
if (options == null)
{
options = new TOptions();
}
foreach (var setup in _setups)
{
if (setup is IConfigureNamedOptions<TOptions> namedSetup)
{
namedSetup.Configure(name, options);
}
else if (name == Options.DefaultName)
{
setup.Configure(options);
}
}
foreach (var post in _postConfigures)
{
post.PostConfigure(name, options);
}
if (_validations != null)
{
var failures = new List<string>();
foreach (var validate in _validations)
{
var result = validate.Validate(name, options);
if (result != null && result.Failed)
{
failures.AddRange(result.Failures);
}
}
if (failures.Count > 0)
{
throw new OptionsValidationException(name, typeof(TOptions), failures);
}
}
return options;
}
}
工程实现
-----------------
| |
JsonConfigurationSource -> | Configuration | -> IOptionsLocalizer<TOptions>
| |
-----------------
项目地址:
OptionsLocalization
Dotnet选项模式的全球化与本地化的更多相关文章
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】
2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[13-扩展之支持全球化 ...
- ASP.NET Core 2.2 基础知识(七) 选项模式
承接上一篇 配置, 选项模式是专门用类来表示相关配置的服务. 基本选项配置 新建一个选项类,该类必须是包含无参数的构造函数的非抽象类. public class MyOptions { public ...
- WPF全球化与本地化
当一个App需要推出多语言版本时,就需要使用到[全球化与本地化]服务. 原理及过程 资源文件中包含了所有的控件信息,通过导出这些控件信息,修改其对应的相关属性(比如TextBlock的Text属性)的 ...
- (13)ASP.NET Core 中的选项模式(Options)
1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...
- asp.net core 3.0 选项模式1:使用
本篇只是从应用角度来说明asp.net core的选项模式,下一篇会从源码来分析 1.以前的方式 以前我们使用web.config/app.config时是这样使用配置的 var count = Co ...
- 第十节:Asp.Net Core 配置详解和选项模式
一. 各种文件的读取 1.说明 在.Net Core中,各种配置文件的读取都需要依赖[Microsoft.Extensions.Configuration]程序集,当然在Asp.Net Core中已经 ...
- Asp.Net Core 混合全球化与本地化支持
前言 最近的新型冠状病毒流行让很多人主动在家隔离,希望疫情能快点消退.武汉加油,中国必胜! Asp.Net Core 提供了内置的网站国际化(全球化与本地化)支持,微软还内置了基于 resx 资源字符 ...
- Asp.Net Core 选项模式的三种注入方式
前言 记录下最近在成都的面试题, 选项模式的热更新, 没答上来 正文 选项模式的依赖注入共有三种接口, 分别是 IOptions<>, IOptionsSnapshot<>, ...
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
随机推荐
- iStore实现 SmartDNS + AdGuard Home IP优选+广告屏蔽
iStore实现 SmartDNS + AdGuard Home IP优选+广告屏蔽 参考自openwrt 官方版 安装配置 AdGuard Home + smartdns 告别广告烦扰 教程 软路由 ...
- 《经验分享——在CSDN编写文章时如何实现空格、空行》
经验分享--在CSDN编写文章时如何实现空格.空行 一.富文本编辑器: 1.空格: 按空格键 2.空行 先按Tab,再按回车键 二.Markdown编辑器: 1. 空格: 按空格键 2.空行: 输入& ...
- 一文了解:仿真技术的巨头——美国Altair公司
Altair公司成立于1967年,总部位于美国马里兰州巴尔的摩,在全球拥有近35000名员工,是一家世界领先的软件公司,在汽车.航空航天.军工和建筑等领域拥有广泛的产品和解决方案. Altair公司主 ...
- java--Struts数据回显、模型驱动、防止表单重复提交
Struts数据效验 表单数据的验证: 前台验证:主要是通过JS验证, 表单数据是否合法! 后台验证:通过后台java代码进行验证! Struts也提供了数据效验的方式! Struts数据效验, 通过 ...
- java用URL下载内容
package Kuang; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStre ...
- 小米手机4 rom 下载链接
简介 https://krunk.cn/kblog563.html
- Matlab 求解线性规划问题 初步
简介 RT code f=[-2; -3; 5]; a=[-2,5,-1;1,3,1]; b=[-10;12]; aeq=[1,1,1] beq=7; [x, y]= linprog(f, a, b, ...
- cgal 的初步学习
简介 cgal 其实说白了就是一个封装好的图形学计算库.因为有很多函数我们经常用到为什么不把他们封装好呢? https://www.cgal.org/ 官网 https://blog.csdn.net ...
- 从 Redis 客户端超时到 .NET 线程池挑战:饥饿、窃取与阻塞的全景解析
在开发 .NET 应用时,我偶然遇到使用 StackExchange.Redis 作为 Redis 客户端时出现的超时问题.经查验,这些问题往往不是 Redis 服务器本身出了故障,而是客户端侧的配置 ...
- 全球人口数量、共享单车GPS轨迹、地铁上下客流数据获取平台分享
本文对目前主要的人口数量与密度.共享单车GPS轨迹.地铁人流与轨迹等数据产品的获取网站加以整理与介绍. 目录 7 人口.共享单车与地铁数据 7.1 人口数据 7.1.1 WorldPop 7.1. ...