Cómo anidar settings en .NET Core
Lo habitual trabajando con ficheros JSON de configuración (o settings) es tener un fichero de settings general y otro por entorno de trabajo.
Un sencillo ejemplo sería el que indico en la siguiente imagen:
En esta imagen, vemos un fichero de configuración mySettings.json y otro mySettings.Development.json.
Aunque en este caso sólo tenemos un fichero de settings para Development, imaginemos que tuviéramos otro para Staging y Production.
Como podemos observar, estos ficheros aparecen anidados, algo que se conoce como Nesting.
Dentro del Explorador de Soluciones de Visual Studio 2019, podemos habilitar o deshabilitar la agrupación o nesting de ficheros haciendo clic en su icono correspondiente:
No obstante, podemos encontrarnos con que la agrupación de ficheros similares no funciona correctamente, sobre todo cuando copiamos y pegamos archivos de configuración o settings de un proyecto a otro, ya sea para organizar mejor éstos o cualquier otra causa.
En este caso veremos algo similar a esto:
¿Cómo resolver el problema?.
Para resolver el problema, tendremos que editar el proyecto o fichero csproj.
Lo que inicialmente tendremos, será muy probablemente algo parecido a lo siguiente:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <Content Include="mySettings.Development.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <ExcludeFromSingleFile>true</ExcludeFromSingleFile> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </Content> <Content Include="mySettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <ExcludeFromSingleFile>true</ExcludeFromSingleFile> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </Content> </ItemGroup> </Project>
Y lo que deberemos hacer, es indicar la dependencia de un fichero con otro, es decir, en nuestro caso, la dependencia de mySettings.Development.json con mySettings.json, algo que lograremos utilizando la propiedad DependentUpon.
Un ejemplo de resolución de este problema sería el siguiente:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Content Include="mySettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="mySettings.Development.json">
<DependentUpon>mySettings.json</DependentUpon>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
Haciendo este pequeño cambio, veremos ahora sí, anidados nuestros ficheros de configuración tal y como queríamos.
Como podemos apreciar, ahora sí, aparecen los archivos de configuración anidados tal y como queríamos que aparecieran desde un principio.
Happy Coding!