Usando Xml Namespaces para optimizar tus imports en Xamarin.Forms

Aprende a optimizar tus imports xmlns con esta nueva característica de Xamarin.Forms 3.5.

Usando Xml Namespaces para optimizar tus imports en Xamarin.Forms

Hola techies, hoy vamos a ver una pequeña pero importante característica de XAML en Xamarin.Forms que podemos usar para optimizar la importación de clases, controles y efectos en nuestro código de marcado que acaba de ver la luz con el release 3.5 de Xamarin.Forms.

Si llevamos un buen tiempo disfrutando de crear aplicaciones con Xamarin.Forms, probablemente habremos creado nuestras propias librerías, ya sea para controles, efectos, behaviours, value-converters, incluso cualquier class helper.

Proyecto de Ejemplo

Y de seguro que habrás notado lo molesto que importar, ya sea, tus propias librerías así como las librerías disponibles en Nuget, siempre termino navegando a la documentación en Github para encontrar el xmlns import para copiarlo y pegarlo.

Xmlns de la forma tradicional

Si, son tantos prefijos y espacios de nombres que incluir ¿Se imaginan escribirlo a mano? Al menos Visual Studio nos permite autocompletarlo. Pero tranquilo, que no habríamos llegado hasta aquí si no tuviéramos una solución para esto. Xamarin.Forms 3.5 nos permite definir espacios de nombres xml al mismo estilo de las librerías de Xamarin.Forms.

xmlns de Xaml

Esto se debe a que el atributo que se utiliza en el proyecto de Xamarin.Forms (XmlnsDefinition) es publico ahora y podemos usarlo en nuestras propias librerías. Esto permite que nuestro enredo de espacios de nombre se transforme a:

Usando xmlns


Increíble! ¿Cierto? Ahora puedo usar todas mis clases simplemente usando mi prefijo techies.

¿Como lo empiezo a usar en mis librerías?

La clase XmlnsDefinition es un atributo de nivel ensamblado, su ubicación perfecta seria el archivo AssemblyInfo.cs, si estamos usando una librería de tipo .NET Standard, habrás notado que no tiene uno archivo de este tipo. Puedes agregar un archivo con el mismo nombre por claridad o colocarlo a nivel de ensamblado (fuera de la declaración del namespace) en cualquier archivo de código.

AssemblyInfo.cs

Por ejemplo, yo quiero mapear los espacios de nombres para mis Controles y Converters y exponerlos bajo somostechies.com/techies, para esto mi archivo AssemblyInfo.cs contiene lo siguiente:

Finalmente, en mi proyecto de Xamarin.Forms, que en este ejemplo se llama TechiesNS puedo importar mi librería usando un único espacio de nombre al mismo estilo de las propias librerías core de Xamarin.Forms.  

Ahora, al compilar nuestro antiguo enemigo, el Linker, eliminara nuestro archivo de código que contiene los mapeos, por lo que tendrán errores que en esencia trataran de decirle que no encuentra los tipos que están usando dentro de su .dll.

Esto podemos resolverlo configurando el Linker en nuestro .csproj o agregando una clase "dummy" como podemos ver a continuación para que el Linker no elimine los mapeos que tanto queremos.

Clase dummy y referencia para que el Linker preserve el código

Recuerda que necesitas definir este mapeo en tus librerías, no podemos hacer este mapeo en el código de nuestra aplicación, de momento tenemos esta limitación. Actualiza tus aplicaciones a Xamarin.Forms 3.5!

Si quieres probar el código tu mismo, el proyecto de ejemplo esta disponible en Github https://github.com/jesulink2514/TechiesNS.