Конкатенация строк в файле yml и использование с aspnetcore 2.1 - PullRequest
0 голосов
/ 07 ноября 2018

объединение строк yml не работает с приложениями .NET. Я попытался удалить знак '$', но он все еще не работает (приложение Java использует знак $ - отлично работает с приложениями Java). Он работает нормально для одного значения, но не с конкатенацией.

ут-01
cicd:
dbname: 172.10.10.110
порт: 5432

ут-02
Источник данных:
url: jdbc: postgresql: // $ {cicd: имя_базы}: $ {cicd: порт} / sample-db

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Я решил это, написав метод расширения для интерфейса 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();
    }
0 голосов
/ 06 декабря 2018

Решение для разрешения заполнителей в конфигурации .NET (аналогично тому, которое предоставляется Spring) доступно в Steeltoe.Common . Мы еще не добавили WebHostBuilder или IConfigurationBuilder расширения, но если вы добавите недавнюю ссылку на Steeltoe.Common из Steeltoe Dev feed , вы сможете сделать что-то вроде этого:

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 вилке eShopOnContainers

0 голосов
/ 07 ноября 2018

Вы должны взглянуть на 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);

Вот ссылка на пакет NetCore

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...