Приходится переводить сервисы из .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)
по которым система конфигурации сама сможет забайндить конфигурацию на поля??
Сори что может сумбурно как-то но в какую сторону копать?
Здравствуйте, Jericho113, Вы писали:
J>Тем что там можно вычитать конфигурацию только с одной иерархии
С трудом тебя понимаю. Если проблема в том что иерархия не подходит — ты можешь обернуть штатный провайдер своим. На нижнем уровне это просто Dictionary<string, string>.
J>Что у меня есть... точнее как заводили ключи (сразу говорю это делали довольно давно и переделать сложно уже J>- иерархия по Энвайромену+ Аппликейшену J>
/<Env_name>/<app_name>/key1
J>к примеру
Ну норм. Что тебя не устраивает?
J>и к этой иерархии еще дополнительная которая глобальна для энва J>
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Я все еще не понимаю в чем у тебя проблема. Если тебе нужно несколько ключей — подключаешь несколько провайдеров, для каждого корня свой.
Сори я возможно сумбурно мысль излагаю но только начинаю на .NET Core переходить из .NET FW 4.7 и поэтому мои вопросы/проблемы
могут показаться пустяковыми и такими которые уже давно решены... только я вот этого решения не могу нагуглить.
Вобщем проблема в том что я не знаю как класс сеттингов заполнить значениями вернувшимися из локальной конфигурации (appsettings.json) и конфигурации вычитанной из AWS System Manager.
public class ExtServiceConnectionString
{
public string Server{get;set;} // это значение определено и прийдет из appsettings.jsonpublic 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
далее сделать байндинг на поля.. инстанса
var cnn = new ExtServiceConnectionString();
configuration.Bind("" cnn )
Сори еще раз может это не проблема вообще и решается просто но дело в том что я не могу понять как.
Я смог только подгрузить всю иерархию /Dev (но это очень много ненужных мне ключей на часть из которых вообще доступа нет)
и потом руками в рантайме разобрать это по конфигурации...
Здравствуйте, Jericho113, Вы писали:
J>В коде мне просто нужно J>.... как то единожды загрузить конфигурация из AWS Param Store по !!!!двум!!! иерархиям J> /Dev/ExtService J> /Dev/GlobalSettings
J>НО стандартно это не поддерживается .NET Core configuration provider for AWS Systems Manager
Здравствуйте, Jericho113, Вы писали:
J>Всем привет.
J>Приходится переводить сервисы из .NET на .NET Core 3.1 ( почему не на .NET 5 потому что он не LTS)
Тут нужно оценивать риски.
То, что 3.1 LTS, не избавляет его от ошибок.
В .NET 5 многое починили, тот же System.Text.Json наконец стало можно использовать, добавили наконец CancellationToken в множество асинхронных методов.
Мы в итоге перешли и всё работает без проблем.
Здравствуйте, _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); // нет ошибок но все поля NULLpublic 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 раз разжеван и расписан но я с ходу ответа на него не нашел...
НС>Ты указал прибиндить секцию "", ее у тебя в конфиге просто нет. Если хочешь прибиндить корень — так и пиши, cfg.Bind(myConfig).
Блин это же очевидно..
Спасибо огромное.
Я чувствую себя просто полным нулем в .NET Core там все слишком так немного по другому...
Спасибо еще раз и прошу прощения за свои как оказывается простейшие и довольно тупые вопросы!