字符串在yml文件中连接并与aspnetcore 2.1一起使用

时间:2018-11-07 05:34:03

标签: asp.net-core yaml

yml字符串连接不适用于.NET应用程序。我已尝试通过删除'$'符号,但仍无法正常工作(Java应用程序使用$符号-与Java应用程序兼容)。对于单个值,它可以正常工作,但不能与串联连接。

yml-01
cicd:
  dbname:172.10.10.110
  端口:5432

yml-02
数据源:
  网址:jdbc:postgresql:// $ {cicd:dbname}:$ {cicd:port} / sample-db

3 个答案:

答案 0 :(得分:0)

您应该看看YamlDotNet

这是一个如何使用该库解决问题的示例

using YamlDotNet.RepresentationModel;
using YamlDotNet.Core;

然后使用您的方法

var dbname = "172.10.10.110";
var port = "5432";
string content;
using (var reader = new StreamReader("your yml file")) 
{
    content = reader.ReadToEnd();
}

var doc = new StringReader(content);
var yaml = new YamlStream();
yaml.Load(doc);

// Add the url where you use string interpolation to replace the values
var ymlFile = (YamlMappingNode)yaml.Documents[0].RootNode;
ymlFile.Children["datasource"] = new YamlMappingNode
{
    { "url", $"jdbc:postgresql://{dbname}:{port}/sample-db" }
};
yaml.Save(File.CreateText("C:\\yourNewFile.yml"), assignAnchors: false);

Here's到NetCore软件包的链接

答案 1 :(得分:0)

我已经通过向IConfiguration接口编写扩展方法解决了这一问题。

    public static string ReadFromConfigRepo(this IConfiguration configuration, string key)
    {
        var pattern = @"\{(.*?)\}";
        var query = configuration[key];

        if (query.Contains('{'))
        {
            var matches = Regex.Matches(query, pattern);
            string value;
            foreach (Match m in matches)
            {
                value = configuration[m.Value.Substring(1, m.Value.Length - 2)];
                query = query.Replace(m.Value, value);
            }
        }
        return query.Trim();
    }

答案 2 :(得分:0)

Steeltoe.Common中提供了.NET配置中占位符解析的解决方案(类似于spring提供的解决方案)。我们尚未添加WebHostBuilderIConfigurationBuilder扩展名,但是如果您从Steeltoe Dev feed添加对Steeltoe.Common的最新引用,您应该可以执行以下操作:

public static IWebHostBuilder ResolveConfigurationPlaceholders(this IWebHostBuilder hostBuilder, LoggerFactory loggerFactory = null)
{
    return hostBuilder.ConfigureAppConfiguration((builderContext, config) =>
       {
           config.AddInMemoryCollection(PropertyPlaceholderHelper.GetResolvedConfigurationPlaceholders(config.Build(), loggerFactory?.CreateLogger("Steeltoe.Configuration.PropertyPlaceholderHelper")));
     });
}

上面的代码在Steeltoe fork of eShopOnContainers

中使用