Однажды вечером, думая о том, как облегчить конфигурацию своего сервера, придумал рекурсивную архитектуру:
У каждого пакета есть структура Config с методом Create(), который возвращает инстанс нужного мне пакета. У сервиса внутри были такие конфиги пакетов, а у них — других пакетов, и в общем это было удобным решением, потому что в рамках одного пакета есть свой конфиг, и больше ему не нужно.
Но однажды я заглянул в файл конфигурации, и увидел это (подробности под катом):
Как видно из вставки выше, конфиг для ErrorLogger повторился, и там было по всему файлу, а сущность-то одна, и конфиг должен был быть один.
На то время я написал уже весь проект, это был курсовой и менять было поздно: сдача утром, а еще писать описание к программе. Пришлось быстро придумать решение: спустя минут 20 оно было найдено.
В примере кода выше видно, что если конфиги одного типа, то они будут читаться как одна глобальная секция, и потом во всем конфиге в нужных местах библиотека поставит его на место. Также, если нужно один и тот же конфиг не выносить в отдельную секцию, можно переименовать секцию, таким образом у нас будет две совершенно не зависящие друг от друга секции.
Ссылка на саму библиотеку: https://github.com/TheMrViper/gini
P.S.: Любые замечания по поводу кода будут учтены.
У каждого пакета есть структура Config с методом Create(), который возвращает инстанс нужного мне пакета. У сервиса внутри были такие конфиги пакетов, а у них — других пакетов, и в общем это было удобным решением, потому что в рамках одного пакета есть свой конфиг, и больше ему не нужно.
Но однажды я заглянул в файл конфигурации, и увидел это (подробности под катом):
{
"MySQL" : {
"User" : "root",
"Pass" : "****"
},
"MainController" : {
"ErrorLogger" : {
"SomeVar" : "SomeValue"
},
"SomeVar" : "SomeValue"
}
"SubController" : {
"ErrorLogger" : {
"SomeVar" : "SomeValue"
},
"SomeVar" : "SomeValue"
}
}
Как видно из вставки выше, конфиг для ErrorLogger повторился, и там было по всему файлу, а сущность-то одна, и конфиг должен был быть один.
На то время я написал уже весь проект, это был курсовой и менять было поздно: сдача утром, а еще писать описание к программе. Пришлось быстро придумать решение: спустя минут 20 оно было найдено.
type MySQLConfig struct {
User string
Pass string
}
type SubConfig struct {
Field string
}
type OtherConfig struct {
Num1 int
Field1 string
Field2 string
SubConfig SubConfig
}
type MainConfig struct {
SubConfig1 SubConfig
SubConfig2 SubConfig `ini:"Sub2"`
MySQLConfig MySQLConfig `ini:"MySQL"`
OtherConfig OtherConfig `ini:"Other"`
}
В примере кода выше видно, что если конфиги одного типа, то они будут читаться как одна глобальная секция, и потом во всем конфиге в нужных местах библиотека поставит его на место. Также, если нужно один и тот же конфиг не выносить в отдельную секцию, можно переименовать секцию, таким образом у нас будет две совершенно не зависящие друг от друга секции.
Ссылка на саму библиотеку: https://github.com/TheMrViper/gini
P.S.: Любые замечания по поводу кода будут учтены.