{"id":1296,"date":"2026-03-16T19:01:55","date_gmt":"2026-03-16T22:01:55","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/"},"modified":"2026-03-16T19:01:55","modified_gmt":"2026-03-16T22:01:55","slug":"feature-management-dotnet-parte-2-filtros-hot-reload-versionado","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/","title":{"rendered":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado"},"content":{"rendered":"\n<p>En el post anterior vimos los conceptos base de Feature Flags con <code>Microsoft.FeatureManagement<\/code>. Ac\u00e1 vamos a profundizar en tres capacidades que marcan la diferencia entre usar flags como simples condicionales y usarlos como una herramienta real de arquitectura: filtros din\u00e1micos con Minimal APIs, recarga en caliente como Kill Switch, y la diferencia conceptual con el versionado de APIs. Tambi\u00e9n incluyo la comparativa completa entre ambos enfoques, que es algo que me preguntan frecuentemente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feature Flags Est\u00e1ticas en Minimal APIs<\/h2>\n\n\n\n<p>El caso m\u00e1s directo: un interruptor booleano evaluado en tiempo de ejecuci\u00f3n. Lo interesante con Minimal APIs es que la integraci\u00f3n es a\u00fan m\u00e1s limpia que en controllers tradicionales \u2014 <code>IFeatureManager<\/code> se inyecta directamente en el handler del endpoint.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ appsettings.json\n{\n  \"FeatureManagement\": {\n    \"NewCheckout\": false\n  }\n}\n\n\/\/ Program.cs\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddFeatureManagement();\nvar app = builder.Build();\n\napp.MapGet(\"\/checkout\", async (IFeatureManager fm) => \n{\n    if (await fm.IsEnabledAsync(\"NewCheckout\"))\n    {\n        return Results.Ok(\"Procesando con el NUEVO flujo de pago.\");\n    }\n    \n    return Results.Ok(\"Procesando con el flujo de pago CL\u00c1SICO.\");\n});\n\napp.Run();<\/code><\/pre>\n\n\n\n<p>La evaluaci\u00f3n ocurre en cada petici\u00f3n. Cambiar <code>false<\/code> por <code>true<\/code> en el archivo de configuraci\u00f3n actualiza el comportamiento sin reiniciar el proceso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Filtros Din\u00e1micos: Canary Releases y Pruebas A\/B<\/h2>\n\n\n\n<p>Los flags booleanos globales resuelven muchos casos, pero en producci\u00f3n real necesit\u00e1s m\u00e1s granularidad. Los <strong>Feature Filters<\/strong> permiten activar caracter\u00edsticas bas\u00e1ndose en reglas contextuales evaluadas en cada petici\u00f3n. .NET incluye dos filtros nativos listos para usar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>PercentageFilter:<\/strong> activa el flag para un porcentaje del tr\u00e1fico. Ideal para Canary releases.<\/li>\n  <li><strong>TimeWindowFilter:<\/strong> activa el flag solo durante una ventana temporal. Ideal para lanzamientos programados o mantenimientos.<\/li>\n<\/ul>\n\n\n\n<p>Ejemplo con <code>PercentageFilter<\/code> + <code>FeatureGate<\/code> en un controller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ appsettings.json \u2014 50% del tr\u00e1fico ve el motor Beta\n{\n  \"FeatureManagement\": {\n    \"BetaSearch\": {\n      \"EnabledFor\": [\n        {\n          \"Name\": \"Percentage\",\n          \"Parameters\": { \"Value\": 50 }\n        }\n      ]\n    }\n  }\n}\n\n\/\/ Program.cs \u2014 registrar el filtro\nbuilder.Services.AddFeatureManagement()\n    .AddFeatureFilter&lt;PercentageFilter&gt;();\n\n\/\/ SearchController.cs\n[ApiController]\n[Route(\"api\/[controller]\")]\npublic class SearchController : ControllerBase\n{\n    [HttpGet]\n    [FeatureGate(\"BetaSearch\")] \/\/ 404 autom\u00e1tico para el 50% que no aplica\n    public IActionResult Get()\n    {\n        return Ok(\"Resultados del motor de b\u00fasqueda Beta.\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>Lo que me gusta de este enfoque es que el <code>[FeatureGate]<\/code> hace que el endpoint directamente no exista para quien no aplica al filtro. No hay l\u00f3gica de \u00absi no entra ac\u00e1, redirig\u00ed all\u00e1\u00bb \u2014 el framework lo maneja solo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hot Reload y Kill Switches: El Poder Real de los Feature Flags<\/h2>\n\n\n\n<p>Esta es la capacidad que m\u00e1s valoro en producci\u00f3n. El sistema de Feature Management se integra con <code>IOptionsSnapshot<\/code>, el mecanismo reactivo de configuraci\u00f3n de .NET. Cuando modific\u00e1s la fuente de configuraci\u00f3n \u2014 ya sea el <code>appsettings.json<\/code>, una variable de entorno o <strong>Azure App Configuration<\/strong> \u2014 el estado del flag se actualiza en memoria autom\u00e1ticamente en la siguiente petici\u00f3n. Sin reinicio, sin downtime.<\/p>\n\n\n\n<p>El caso de uso m\u00e1s cr\u00edtico: el <strong>Kill Switch<\/strong>. Si una feature nueva empieza a generar errores en producci\u00f3n, en lugar de hacer rollback del deploy entero (proceso que puede tomar minutos), simplemente cambi\u00e1s el flag a <code>false<\/code> y la pr\u00f3xima petici\u00f3n ya usa el c\u00f3digo anterior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddFeatureManagement();\nvar app = builder.Build();\n\napp.MapGet(\"\/health\", async (IFeatureManager fm) => \n{\n    \/\/ Un operador cambia \"MaintenanceMode\" a true en appsettings.json.\n    \/\/ La SIGUIENTE petici\u00f3n refleja el cambio al instante, sin reiniciar el proceso.\n    bool isMaintenance = await fm.IsEnabledAsync(\"MaintenanceMode\");\n    \n    if (isMaintenance)\n    {\n        return Results.StatusCode(503); \/\/ Service Unavailable\n    }\n    \n    return Results.Ok(\"Sistema Operativo\");\n});\n\napp.Run();<\/code><\/pre>\n\n\n\n<p>En proyectos donde integramos con Azure App Configuration, esto va un paso m\u00e1s all\u00e1: pod\u00e9s cambiar el flag desde un panel web, sin acceso al servidor, y el efecto es inmediato. Para equipos de guardia nocturna o sistemas de alta disponibilidad, esto es invaluable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feature Flags vs. Versionado de API: La Confusi\u00f3n M\u00e1s Frecuente<\/h2>\n\n\n\n<p>Es la pregunta que m\u00e1s aparece cuando presento este tema. Son herramientas distintas para problemas distintos, aunque superficialmente parecen hacer lo mismo (exponer diferentes comportamientos seg\u00fan contexto).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Criterio<\/th><th>Feature Flags<\/th><th>Versionado de API<\/th><\/tr><\/thead><tbody><tr><td><strong>Problema que resuelve<\/strong><\/td><td>Exposici\u00f3n controlada: gestiona <em>qui\u00e9n<\/em> y <em>cu\u00e1ndo<\/em> accede a un cambio<\/td><td>Compatibilidad de contratos: clientes antiguos no se rompen ante cambios destructivos<\/td><\/tr><tr><td><strong>Tiempo de vida<\/strong><\/td><td><strong>Ef\u00edmero.<\/strong> Una vez estable, la flag y el c\u00f3digo viejo deben eliminarse (deuda t\u00e9cnica)<\/td><td><strong>Prolongado.<\/strong> v1 y v2 coexisten por a\u00f1os<\/td><\/tr><tr><td><strong>Mecanismo de control<\/strong><\/td><td>Configuraci\u00f3n externa, reglas de negocio, evaluaci\u00f3n en runtime<\/td><td>Rutas est\u00e1ticas (<code>\/api\/v1\/<\/code>), headers HTTP o referencias de ensamblado<\/td><\/tr><tr><td><strong>Infraestructura<\/strong><\/td><td>Un solo binario con todos los caminos l\u00f3gicos<\/td><td>Pueden ser m\u00faltiples binarios o deploys paralelos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La regla que uso: si el cambio es <strong>interno y temporal<\/strong> (lo vas a limpiar cuando sea estable), us\u00e1 Feature Flags. Si el cambio <strong>rompe el contrato p\u00fablico<\/strong> con consumidores externos que necesitan tiempo para migrar, us\u00e1 versionado. En proyectos complejos, ambos conviven sin problema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos pasos<\/h2>\n\n\n\n<p>Estos tres patrones cubren la gran mayor\u00eda de los casos de uso cotidianos. El siguiente nivel son los <strong>Custom Feature Filters<\/strong> \u2014 filtros personalizados que habilitan flags seg\u00fan el tenant de la base de datos, el rol del usuario, la regi\u00f3n geogr\u00e1fica o cualquier l\u00f3gica de negocio propia. Y despu\u00e9s de eso, la integraci\u00f3n con <strong>Azure App Configuration<\/strong> para centralizar todos los flags en un servicio externo con targeting por usuario o segmento.<\/p>\n\n\n\n<p>\u00bfTe interesa alguno de esos dos temas para el pr\u00f3ximo art\u00edculo? Dejalo en los comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Segunda parte sobre Feature Management en .NET: filtros din\u00e1micos (PercentageFilter, TimeWindowFilter) para Canary releases, Hot Reload con IOptionsSnapshot como Kill Switch, y la comparativa completa entre Feature Flags y Versionado de API con tabla incluida.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1,202],"tags":[371,378,370,368,374,366,367,373,375,372,379,376,324,377,369],"class_list":["post-1296","post","type-post","status-publish","format-standard","hentry","category-blog","category-dotnet","tag-a-b-testing","tag-azure-app-configuration","tag-canary-release","tag-ci-cd-2","tag-configuracion","tag-feature-flags-2","tag-feature-management","tag-featuregate","tag-hot-reload","tag-ifeaturemanager","tag-ioptionssnapshot","tag-kill-switch","tag-middleware","tag-minimal-apis","tag-trunk-based-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Segunda parte sobre Feature Management en .NET: filtros din\u00e1micos (PercentageFilter, TimeWindowFilter) para Canary releases, Hot Reload con IOptionsSnapshot como Kill Switch, y la comparativa completa entre Feature Flags y Versionado de API con tabla incluida.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-16T22:01:55+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado\",\"datePublished\":\"2026-03-16T22:01:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/\"},\"wordCount\":748,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"A\\\/B Testing\",\"Azure App Configuration\",\"Canary Release\",\"CI\\\/CD\",\"Configuracion\",\"Feature Flags\",\"Feature Management\",\"FeatureGate\",\"Hot Reload\",\"IFeatureManager\",\"IOptionsSnapshot\",\"Kill Switch\",\"middleware\",\"Minimal APIs\",\"Trunk-based Development\"],\"articleSection\":[\"Blog\",\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/\",\"name\":\"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-16T22:01:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/","og_locale":"es_ES","og_type":"article","og_title":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal","og_description":"Segunda parte sobre Feature Management en .NET: filtros din\u00e1micos (PercentageFilter, TimeWindowFilter) para Canary releases, Hot Reload con IOptionsSnapshot como Kill Switch, y la comparativa completa entre Feature Flags y Versionado de API con tabla incluida.","og_url":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-16T22:01:55+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado","datePublished":"2026-03-16T22:01:55+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/"},"wordCount":748,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["A\/B Testing","Azure App Configuration","Canary Release","CI\/CD","Configuracion","Feature Flags","Feature Management","FeatureGate","Hot Reload","IFeatureManager","IOptionsSnapshot","Kill Switch","middleware","Minimal APIs","Trunk-based Development"],"articleSection":["Blog","DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/","url":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/","name":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-16T22:01:55+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-management-dotnet-parte-2-filtros-hot-reload-versionado\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Feature Management en .NET (Parte 2): Filtros Din\u00e1micos, Hot Reload y Feature Flags vs. Versionado"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1296"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1296\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}