.NET Core composite configuration
От: Jericho113 Украина  
Дата: 18.12.20 13:12
Оценка:
Всем привет.

Приходится переводить сервисы из .NET на .NET Core 3.1 ( почему не на .NET 5 потому что он не LTS)

И вот возникли небольшие проблемы с миграцией конфигурации...
Она размазана по appsettings.{dev/qa/prod}.json -там хранятся всякие несекьюрные вещи типа урлов внешних сервисов и всяких там таймаутов и т.п.
Все пароли, серваки и т.п. уехали в AWS SystemManager Paramter Store — это девопсы выбирали такое хранилище вместе с безопасниками — девелоперов поставили перед фактом.
т.е в JSON конфигурации сейчас вот такое

// JSON Config  - appsettings.Dev.json
InternalServiceSettings:{
    URL="https://aa/bb/cc",
    User="", // уехало в AWS SM Param Store  по ключу /Dev/InternalServiceSettings/User
    Password=""// уехало в AWS SM Param Store по ключу /Dev/InternalServiceSettings/User/Password
 }

В консольной аппликухе есть класс
public class InternalServiceSettings 
{
    public string URL{get;set;} 
    public string User{get;set;} 
    public string Password{get;set;}
}

в который раньше всасывались сеттинги из json как
 var settings= new InternalServiceSettings();
    configuration.Bind("InternalServiceSettings",settings);


Что есть — вычитка всего из AWS Param Store и потом ручное распихивание в коде по полям которые не заполнены...
Т.е. все вычитать из JSON конфига, потом полезть в AWS ParamStore и оттуда достать все и потом руками в коде распихать по нужным полям.

Хотелось бы что бы
Как- либо все вычитанное из AWS ParamStore вместить в .NET Core Configuration т.е. что бы оно уже было доступно как будто это локальный конфиг.
Байндить значения из конфига на инстанс класса как и ранее..

Может как-то можно поля класса разметить аттрибутами которые определяют ключи (/Dev/InternalServiceSettings/User /Dev/InternalServiceSettings/User/Password)
по которым система конфигурации сама сможет забайндить конфигурацию на поля??

Сори что может сумбурно как-то но в какую сторону копать?
NetDigitally yours ....
.net core configuration aws
Re: .NET Core composite configuration
От: Ночной Смотрящий Россия  
Дата: 18.12.20 15:37
Оценка: +1
Здравствуйте, Jericho113, Вы писали:

J>Сори что может сумбурно как-то но в какую сторону копать?


Давай начнем с простого. Чем вот это не подходит?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: .NET Core composite configuration
От: Jericho113 Украина  
Дата: 19.12.20 18:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Давай начнем с простого. Чем вот это не подходит?


Тем что там можно вычитать конфигурацию только с одной иерархии
т.е.
/myapplication
/myapplication/sybkey1
/myapplication/sybkey1/sybkey11
/myapplication/sybkey1/sybkey11/keyxxx
/myapplication/sybkey2/subkey33/keyzz/


и в примере это показано..
Я там вдоль и поперек все просмотрел.. даже в код на гитхабе лазил но поддерживается конфигурация по иерархии одного ключа.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddSystemsManager("/myapplication");
        })
        .UseStartup<Startup>();


Что у меня есть... точнее как заводили ключи (сразу говорю это делали довольно давно и переделать сложно уже
— иерархия по Энвайромену+ Аппликейшену
/<Env_name>/<app_name>/key1

к примеру
/Dev/MyService01/DB/Password
/Dev/MyService01/Redis/Password
/Dev/MyService01/Connection/SomeOtherSecret


и к этой иерархии еще дополнительная которая глобальна для энва
/dev/pgsql/user01/password
/dev/rds/user_abc/password
NetDigitally yours ....
Re[3]: .NET Core composite configuration
От: Ночной Смотрящий Россия  
Дата: 19.12.20 21:30
Оценка:
Здравствуйте, Jericho113, Вы писали:

J>Тем что там можно вычитать конфигурацию только с одной иерархии


С трудом тебя понимаю. Если проблема в том что иерархия не подходит — ты можешь обернуть штатный провайдер своим. На нижнем уровне это просто Dictionary<string, string>.

J>Что у меня есть... точнее как заводили ключи (сразу говорю это делали довольно давно и переделать сложно уже

J>- иерархия по Энвайромену+ Аппликейшену
J>
/<Env_name>/<app_name>/key1

J>к примеру

Ну норм. Что тебя не устраивает?

J>и к этой иерархии еще дополнительная которая глобальна для энва

J>
J>/dev/pgsql/user01/password
J>/dev/rds/user_abc/password
J>


Я все еще не понимаю в чем у тебя проблема. Если тебе нужно несколько ключей — подключаешь несколько провайдеров, для каждого корня свой.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: .NET Core composite configuration
От: Jericho113 Украина  
Дата: 20.12.20 15:37
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Я все еще не понимаю в чем у тебя проблема. Если тебе нужно несколько ключей — подключаешь несколько провайдеров, для каждого корня свой.


Сори я возможно сумбурно мысль излагаю но только начинаю на .NET Core переходить из .NET FW 4.7 и поэтому мои вопросы/проблемы
могут показаться пустяковыми и такими которые уже давно решены... только я вот этого решения не могу нагуглить.

Вобщем проблема в том что я не знаю как класс сеттингов заполнить значениями вернувшимися из локальной конфигурации (appsettings.json) и конфигурации вычитанной из AWS System Manager.
public class ExtServiceConnectionString
{
    public string Server{get;set;} // это значение определено и прийдет из appsettings.json
    public string User{get;set;} // это определено и прийдет из AWS Param Store по ключу /Dev/ExtService/User
    publis string Token {get;set;} // это определено и прийдет из AWS Param Store по ключу /Dev/GlobalSettings/Token
}

В коде мне просто нужно
.... как то единожды загрузить конфигурация из AWS Param Store по !!!!двум!!! иерархиям
/Dev/ExtService
/Dev/GlobalSettings

НО стандартно это не поддерживается .NET Core configuration provider for AWS Systems Manager

далее сделать байндинг на поля.. инстанса
var cnn = new ExtServiceConnectionString();
configuration.Bind("" cnn )


Сори еще раз может это не проблема вообще и решается просто но дело в том что я не могу понять как.

Я смог только подгрузить всю иерархию /Dev (но это очень много ненужных мне ключей на часть из которых вообще доступа нет)
и потом руками в рантайме разобрать это по конфигурации...
NetDigitally yours ....
Re[5]: .NET Core composite configuration
От: Ночной Смотрящий Россия  
Дата: 20.12.20 19:28
Оценка: 6 (1)
Здравствуйте, Jericho113, Вы писали:

J>В коде мне просто нужно

J>.... как то единожды загрузить конфигурация из AWS Param Store по !!!!двум!!! иерархиям
J> /Dev/ExtService
J> /Dev/GlobalSettings

J>НО стандартно это не поддерживается .NET Core configuration provider for AWS Systems Manager


Это чего вдруг? Пример по ссылке:
builder.AddSystemsManager("/myapplication");

В твоем случае это будет:
builder
    .AddSystemsManager("/Dev/ExtService")
    .AddSystemsManager("/Dev/GlobalSettings");

Порядок важен, от него зависит приоритет.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: .NET Core composite configuration
От: _NN_ www.nemerleweb.com
Дата: 21.12.20 18:28
Оценка: +1
Здравствуйте, Jericho113, Вы писали:

J>Всем привет.


J>Приходится переводить сервисы из .NET на .NET Core 3.1 ( почему не на .NET 5 потому что он не LTS)

Тут нужно оценивать риски.
То, что 3.1 LTS, не избавляет его от ошибок.
В .NET 5 многое починили, тот же System.Text.Json наконец стало можно использовать, добавили наконец CancellationToken в множество асинхронных методов.
Мы в итоге перешли и всё работает без проблем.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: .NET Core composite configuration
От: Jericho113 Украина  
Дата: 22.12.20 13:21
Оценка:
Здравствуйте, _NN_, Вы писали:

J>>Приходится переводить сервисы из .NET на .NET Core 3.1 ( почему не на .NET 5 потому что он не LTS)

_NN>Тут нужно оценивать риски.
_NN>То, что 3.1 LTS, не избавляет его от ошибок.
_NN>В .NET 5 многое починили, тот же System.Text.Json наконец стало можно использовать, добавили наконец CancellationToken в множество асинхронных методов.
_NN>Мы в итоге перешли и всё работает без проблем.

К сожалению решение о выборе версии принималось не мной и я не смог на него повлиять приведя кучу доводов за NET 5.
Я до сих пор не могу убедить менеджмент начать уходить от jQuery +jQuery UI на основой апликухе в сторону ReactJS
они решили не трогать ее и переписывать по частям в новую.. и сейчас команда распыляет усилия по созданию практически с нуля новой версии и
поддерживая старую в которой очень сложно уже стало UI переделывать/исправлять.

Сори за оффтоп вверху..

У меня вот снова вопрос — сори если опять очень простой я уже SO и доки пересмотел но ответа не нашел
есть куча конфигурация добавляемая InMemory и есть простой класс — но не получается забайндить его к конфигурации
var cfgBuilder= new ConfigurationBuilder();
var cfgItems = new Dictionary<string,string>    
{
    {"ResetTimeout","1000"},{"Url","https:/external-url.com"},{"UseSync","true"}
}
cfgBuilder.AddInMemoryCollection(cfgItems);
var cfg = cfgBuilder.Build();    

var myConfig = new MyConfig();
cfg.Bind("",myConfig);  // нет ошибок но все поля NULL

public class MyConfig
{
    public int? ResetTimeout{get;set;}
    public string Url{get;set;}
    public bool? UseSync{get;set;}
}


Есть ли какая либо возможность автоматически забайндить конфигурацию на поля инстанса или нужно по отдельности только
....
var myConfig = new MyConfig();
myConfig.ResetTimeout =cfg.GetValue<int?>("ResetTimeout");
myConfig.Url=cfg.GetValue<string>("Url");
myConfig.Url=cfg.GetValue<bool?>("UseSync");


Сори если вопрос уже 300 раз разжеван и расписан но я с ходу ответа на него не нашел...
NetDigitally yours ....
Re[6]: .NET Core composite configuration
От: Jericho113 Украина  
Дата: 22.12.20 13:28
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>В твоем случае это будет:

...
НС>Порядок важен, от него зависит приоритет.

Спасибо!! Это то что нужно.
Про порядок вызова я знаю просто вообще не подумал что можно более одного раза вызвать для разных ключей.
NetDigitally yours ....
Re[3]: .NET Core composite configuration
От: Ночной Смотрящий Россия  
Дата: 22.12.20 19:37
Оценка: 6 (1)
Здравствуйте, Jericho113, Вы писали:

J>cfg.Bind("",myConfig); // нет ошибок но все поля NULL


Ты указал прибиндить секцию "", ее у тебя в конфиге просто нет. Если хочешь прибиндить корень — так и пиши, cfg.Bind(myConfig).
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: .NET Core composite configuration
От: Jericho113 Украина  
Дата: 23.12.20 11:57
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:


НС>Ты указал прибиндить секцию "", ее у тебя в конфиге просто нет. Если хочешь прибиндить корень — так и пиши, cfg.Bind(myConfig).


Блин это же очевидно..
Спасибо огромное.

Я чувствую себя просто полным нулем в .NET Core там все слишком так немного по другому...
Спасибо еще раз и прошу прощения за свои как оказывается простейшие и довольно тупые вопросы!
NetDigitally yours ....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.