Simplificando los Namespaces XML Implícitos y Globales en .NET 10 para .NET MAUI

Como desarrolladores, la oportunidad de optimizar nuestro código sin afectar el resultado final es siempre bienvenida. En este artículo, exploraremos una característica innovadora introducida en .NET 10 Preview 5 que simplifica drásticamente la forma en que gestionamos los namespaces XML en nuestros proyectos, especialmente en el contexto de .NET MAUI. Prepárense para decir adiós a muchas líneas repetitivas y dar la bienvenida a un código más limpio y legible.

¿De qué se trata esta novedad?

Se ha introducido un nuevo namespace global que consolida una gran parte de los namespaces esenciales para que su código XAML funcione correctamente. Esto permite eliminar casi todas esas líneas xmlns repetitivas que tradicionalmente se copiaban y pegaban al inicio de cada archivo XAML. La mejora reduce la verbosidad, aumenta la claridad y facilita el mantenimiento, centralizando la declaración de los namespaces comunes y permitiendo a los desarrolladores enfocarse en la lógica y el diseño de la interfaz de usuario.

Analizando los cambios

Namespaces «globales» a nivel de proyecto

El protagonista es el nuevo xmlns: http://schemas.microsoft.com/dotnet/maui/global. Este namespace global agrega varios namespaces bajo una misma declaración, incluyendo por defecto:

  • El xmlns de MAUI (generado por la fuente).
  • Su namespace principal ({YourNamespace}).
  • El namespace específico para páginas ({YourNamespace}.Pages).

Esto hace que muchos componentes de .NET MAUI estén disponibles sin declaraciones explícitas adicionales en cada archivo XAML. La reducción de código repetitivo es sustancial, mejorando la legibilidad y la productividad, especialmente en proyectos grandes con múltiples archivos XAML.

Ejemplo práctico: Antes vs. Ahora

Para ilustrar el cambio, veamos un ejemplo de código:

Antes (estilo .NET 8)

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:models="clr-namespace:MyAwesomeApp.Models"
             xmlns:controls="clr-namespace:MyAwesomeApp.Controls"
             x:Class="MyAwesomeApp.Views.MyPage"
             Title="Mi Página">
    <VerticalStackLayout>
        <controls:TagView Text="Etiqueta de Control" />
        <Label Text="Hola, .NET MAUI!" />
    </VerticalStackLayout>
</ContentPage>

Después (.NET 10 Preview 5)

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/maui/global"
             x:Class="MyAwesomeApp.Views.MyPage"
             Title="Mi Página">
    <VerticalStackLayout>
        <TagView Text="Etiqueta de Control" />
        <Label Text="Hola, .NET MAUI!" />
    </VerticalStackLayout>
</ContentPage>

En el código posterior, las declaraciones xmlns:models y xmlns:controls se eliminan al estar declaradas globalmente en un archivo GlobalXmlns.cs. Además, la llamada a TagView ya no requiere el prefijo controls:, haciendo el código más conciso.

  • Las declaraciones xmlns:models o xmlns:controls ya no son necesarias en cada archivo XAML.
  • Los controles como TagView se pueden llamar directamente sin prefijos, si su namespace está registrado globalmente.

Esta simplificación es muy útil en proyectos grandes con muchos controles personalizados, donde la repetición de prefijos es común. Elimina la redundancia y hace el código más limpio y fácil de entender.


Compatibilidad con versiones anteriores

Esta nueva forma de añadir namespaces es totalmente compatible con versiones anteriores. Las declaraciones xmlns: existentes en el formato antiguo seguirán funcionando. Sin embargo, se recomienda actualizar su código para aprovechar este nuevo enfoque, mejorando la mantenibilidad y alineación con las mejores prácticas.

¿Cuándo utilizar xmlns: explícitos?

Es necesario utilizar declaraciones xmlns: explícitas para desambiguar nombres de tipos duplicados. Si dos namespaces diferentes contienen tipos con el mismo nombre (ej. dos clases Label de distintas librerías), los prefijos (como controls:Label o custom:Label) serán cruciales para distinguirlos en su XAML y evitar conflictos.


Namespace por defecto implícito (opt-in)

Para una mayor limpieza, existe la opción de habilitar un namespace por defecto implícito. Al optar por esta configuración, el compilador inyecta automáticamente el namespace raíz http://schemas.microsoft.com/dotnet/2021/maui. Esto permite eliminar las líneas raíz de xmlns y xmlns:x de sus archivos XAML, resultando en un código más minimalista.

Ejemplo de código con esta opción:

<ContentPage x:Class="MyAwesomeApp.Views.MyPage"
             Title="Mi Página">
    <VerticalStackLayout>
        <TagView Text="Etiqueta de Control" />
        <Label Text="Hola, .NET MAUI!" />
    </VerticalStackLayout>
</ContentPage>

Aquí, no es necesario añadir xmlns ni xmlns:x porque están implícitamente incluidos en el namespace global. Esto permite un XAML increíblemente conciso y enfocado en el contenido y la estructura de la interfaz de usuario.


¿Cómo probar esta experiencia?

Para implementar estas mejoras, siga estos pasos:

  1. Actualicen el proyecto para que apunte a los target frameworks de net10.0- en el archivo .csproj. Por ejemplo:
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
        <TargetFrameworks Condition="$(RuntimeIdentifier.StartsWith('win'))">$(TargetFrameworks);net10.0-windows10.0.19041.0</TargetFrameworks>
        ...
      </PropertyGroup>
    </Project>
  2. Creen un archivo GlobalXmlns.cs a nivel de proyecto para registrar sus namespaces CLR globalmente en XAML. Ejemplo:
    global using static MyAwesomeApp.GlobalXmlns;
    
    namespace MyAwesomeApp;
    
    public static class GlobalXmlns
    {
        public const string Models = "clr-namespace:MyAwesomeApp.Models";
        public const string Controls = "clr-namespace:MyAwesomeApp.Controls";
        // Agregue aquí cualquier otro namespace que desee hacer global
    }
  3. Eliminen las líneas xmlns: y los prefijos redundantes de sus archivos XAML.

Si prefieren seguir utilizando prefijos xmlns, pueden definirlos por defecto en el archivo GlobalXmlns.cs, combinando la centralización de las declaraciones con el uso de prefijos:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/dotnet/maui/global", "MyAwesomeApp.Models", Prefix = "models")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/dotnet/maui/global", "MyAwesomeApp.Controls", Prefix = "controls")]

Con estos pasos, sus proyectos .NET MAUI se beneficiarán de un código XAML más limpio, legible y fácil de mantener, optimizando su flujo de trabajo.

Gracias por leer este artículo. Si tienen alguna pregunta o comentario, déjenlo en la sección de abajo. ¡Nos vemos en la próxima!

Author: Enagora

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *