今天弄了一个配置随着使用环境动态切换的功能,一个基本的思路是:
-
将配置配置为模板的形式,
-
根据不同的环境定义环境变量
-
根据环境变量渲染模板,生成具体的配置
这里面就涉及到了一个字符串模板的功能,关于模板语法,我选择的是最近比较流行的"Mustache"语法 ,基本格式就是基于双大括号的文本插值,
<span>Message: {{ msg }}</span>
Mustache的特点是比较简单易读易用,就算运维人员也不难理解和使用。
至于到了实现,本身只是实现一个简单的花括号插值还是比较简单的,自己实现也没几行代码,但考虑到以后的扩展性,还是使用支持完整的Mustache语法的引擎吧,官方的C#解析库是stubble,一个基本示例如下:
var stubble = new StubbleBuilder().Build();
var output = stubble.Render("hi {{name}}", new {name = "world"});
也能接受Dictionary类型作为参数,非常方便。
var output = stubble.Render("hi {{name}}",
new Dictionary<string, object>()
{
["name"] = "world"
});
其他的例子这里就不介绍了,如果感兴趣可以查看其官方示例。
另外一个比较流行的Mustache库是Nustache,体积要小些,接口也要简单点,
var output = Render.StringToString("hi {{name}}", new {name = "world"});
不过它有两个问题。
-
不过它没有.net core的版本,只有一个移植版 nustache.core,也是3年前的
-
它语法检查没有 stubble严格,例如渲染"" hi {{name} }""这样一个错误的模板不抛异常,并给出了错误的渲染结果。而stubble会报错,
基于以上两个原因,我觉得还是官方推荐的stubble更合适些。
除此之外,我在搜索字符串模板的时候,找到了另一个比较流行的模板liquid,语法用起来也非常类似
Template template = Template.Parse("hi {{name}}"); // Parses and compiles the template
template.Render(Hash.FromAnonymousObject(new { name = "tobi" })); // => "hi tobi"
感兴趣的朋友可以参考下如下文章:DotLiquid模板引擎简介