0

Lanzamiento de .Net Community Toolkit 8 #1

Se encuentra disponible la versión 8.0.0 en NuGet. Este lanzamiento marca un hito importante al incluir una variedad de nuevas características, mejoras, optimizaciones, correcciones de errores y numerosas refactorizaciones para reflejar la nueva estructura y organización del proyecto, las cuales se detallarán en este post.

Al igual que con todas las versiones previas del conjunto de herramientas de la comunidad, cada modificación fue influenciada por los comentarios recibidos tanto de los equipos de Microsoft que utilizan el conjunto de herramientas como de otros desarrolladores de la comunidad. Expresamos nuestra sincera gratitud a todos aquellos que han contribuido y que continúan colaborando para perfeccionar el conjunto de herramientas de la comunidad de .NET día a día.

¿Qué hay en el kit de herramientas de la comunidad de .NET?

El kit de herramientas de la comunidad de .NET es un conjunto de recursos y utilidades desarrolladas por la comunidad para facilitar el desarrollo en el entorno .NET. Estas herramientas están diseñadas para mejorar la productividad, proporcionar funcionalidades adicionales y abordar diversas necesidades de los desarrolladores. Algunos ejemplos de lo que podría incluir el kit de herramientas de la comunidad de .NET son:

  • Bibliotecas y Extensiones: Ofrece bibliotecas y extensiones que amplían las funcionalidades de .NET, proporcionando soluciones comunes para tareas específicas.
  • Plantillas de Proyectos: Incluye plantillas predefinidas para proyectos que pueden acelerar el proceso de inicio y proporcionar una estructura básica para diferentes tipos de aplicaciones.
  • Herramientas de Desarrollo: Ofrece herramientas que facilitan el desarrollo, como extensiones para entornos de desarrollo integrados (IDE) o scripts que automatizan ciertas tareas.
  • Documentación Mejorada: Proporciona documentación mejorada y ejemplos de código que ayudan a los desarrolladores a comprender y utilizar eficazmente las tecnologías de .NET.
  • Recursos de Aprendizaje: Incluye recursos de aprendizaje, como tutoriales, videos y cursos, que permiten a los desarrolladores mejorar sus habilidades en el ecosistema .NET.
  • Compatibilidad y Polifuncionalidad: Puede abordar desafíos específicos de la comunidad, como la compatibilidad con plataformas específicas, la integración con tecnologías emergentes o la implementación de patrones de diseño comunes.

En general, el kit de herramientas de la comunidad de .NET refleja la colaboración y el esfuerzo colectivo de la comunidad para mejorar la experiencia de desarrollo en el ecosistema .NET. Cada herramienta o recurso puede abordar necesidades específicas y proporcionar soluciones valiosas para los desarrolladores que trabajan con tecnologías de Microsoft.

Historia

Es probable que surja la interrogante sobre por qué la versión inicial de .NET Comunidad Utilitaria lleva el rótulo de 8.0.0. Cuestionamiento perspicaz, sin duda. La explicación radica en que todas las bibliotecas del Conjunto de Utilidades Comunitarias de .NET formaban parte originalmente del Conjunto de Utilidades Comunitarias de Windows, una recopilación de aplicaciones suplementarias, extensiones y controles personalizados que simplifican y presentan de manera clara las tareas habituales de los desarrolladores que crean aplicaciones para UWP y .NET destinadas a Windows 10 y Windows 11.

Con el transcurso del tiempo, el número de API dirigidas a .NET y sin dependencias específicas de Windows experimentó un crecimiento, y optamos por fragmentarlas en un proyecto independiente para que pudieran evolucionar de manera autónoma y ser más accesibles para los desarrolladores de .NET que no se dedican al desarrollo de Windows. Así nació el Conjunto de Utilidades Comunitarias de .NET. Esta medida también simplificó la organización de la documentación, que ahora presenta secciones diferenciadas para cada conjunto de herramientas específico de la plataforma.

Considerando que la última versión del Windows Community Toolkit antes de la bifurcación ostentaba el número 7.1.x, decidimos mantener esa numeración en la versión semántica para que la transición resulte más comprensible para los usuarios existentes, y así, la primera iteración de .NET Community Toolkit asume el número 8.0.0. En el futuro, se asignarán versiones de forma independiente al conjunto de herramientas de la comunidad de Windows, ya que cada proyecto seguirá su propio plan y calendario de lanzamiento.

Herramientas de MVVM

Como se dio a conocer previamente en la versión 7.0, uno de los elementos esenciales de .NET Comunidad Utilitaria es el Kit de Herramientas MVVM: una biblioteca MVVM contemporánea, eficiente, sin restricciones de plataforma y modular. Esta biblioteca es la misma que emplean Microsoft Store, la aplicación Fotografías y diversas aplicaciones adicionales.

El Kit de Herramientas MVVM toma inspiración de MvvmLight y también se presenta como la opción oficial ahora que la biblioteca ha quedado en desuso. También colaboramos con Laurent Bugnion durante el desarrollo del Kit de Herramientas MVVM, y él ha respaldado este kit como el camino a seguir para los usuarios existentes de MvvmLight (además, se encuentran disponibles documentos de migración para facilitar este proceso).

Se derivan de principios clave los fundamentos del conjunto de herramientas MVVM.

  • Independiente de la plataforma: lo que significa que no tiene dependencias de marcos de interfaz de usuario específicos. Puedes usarlo para compartir código entre UWP, WinUI 3, MAUI, WPF, Avalonia, Uno y mucho más.
  • Independiente del tiempo de ejecución: la biblioteca es multidestino y admite hasta .NET Standard 2.0, lo que significa que puede obtener mejoras de rendimiento cuando se ejecuta en entornos de ejecución modernos (por ejemplo, .NET 6), además de poder usarlo incluso en .NET Framework.
  • Fácil de aprender y usar: no hay requisitos estrictos sobre la estructura de la aplicación o los patrones de codificación a utilizar. Puede utilizar la biblioteca para adaptarla a su propia arquitectura y estilo.
  • A la carta: todos los componentes son independientes y se pueden utilizar también por separado. No hay un enfoque de «todo incluido» al que te veas obligado: si solo quieres usar un solo tipo de toda la biblioteca, puedes hacerlo sin problemas, y luego comenzar a usar gradualmente más funciones según sea necesario.
  • Implementación de referencia: todas las API disponibles están pensadas para ser sencillas y de alto rendimiento, lo que proporciona «implementaciones de referencia» para las interfaces que se incluyen en la biblioteca de clases base de .NET, pero carecen de tipos concretos para usarlas directamente. Por ejemplo, podrá encontrar una «implementación de referencia» para interfaces como o .INotifyPropertyChangedICommand

Generadores de origen de MVVM

La principal novedad de la versión 8.0.0 del conjunto de herramientas MVVM son los nuevos generadores de código fuente de MVVM, concebidos para reducir en gran medida el código repetitivo necesario para configurar una aplicación mediante MVVM. En comparación con los generadores de vista previa que enviamos en la versión 7.1.0, también han sido completamente reescritos para ser generadores incrementales, lo que implica que se ejecutarán mucho más rápidamente que antes y contribuirán a mantener el entorno de desarrollo integrado (IDE) rápido y ágil, incluso al trabajar en proyectos a gran escala.

Comandos

La necesidad de establecer una propiedad para cada método que deseamos exponer de manera abstracta a los distintos componentes de la interfaz de usuario en nuestras aplicaciones, con la intención de que sean invocados (por ejemplo, botones), es clara.

Es aquí donde entra en acción el nuevo atributo: esto posibilitará que MVVM Toolkit genere automáticamente comandos (utilizando los tipos incorporados en la biblioteca) con la firma adecuada, dependiendo del método anotado.

Para efectuar una comparación, este sería el enfoque convencional para configurar un comando:

private IRelayCommand<User> greetUserCommand;

public IRelayCommand<User> GreetUserCommand => greetUserCommand ??= new RelayCommand<User>(GreetUser);

private void GreetUser(User user)
{
    Console.WriteLine($"Hello {user.Name}!");
}

Ahora:

[RelayCommand]
private void GreetUser(User user)
{
    Console.WriteLine($"Hello {user.Name}!");
}

El generador de fuentes se encargará de crear la propiedad correspondiente según el método anotado. Además, también se puede especificar un método y es posible controlar el grado de simultaneidad de los comandos asíncronos.

Propiedades observables

La elaboración de propiedades observables puede ser sumamente minuciosa, especialmente cuando se necesita agregar lógica adicional para controlar las propiedades dependientes que deben notificarse. Ahora, todo esto puede simplificarse considerablemente mediante el empleo de los recientes atributos del kit de herramientas MVVM y permitiendo que el generador de código fuente genere propiedades observables en segundo plano.

Los nuevos atributos son [ObservableProperty] [NotifyPropertyChangedFor] [NotifyCanExecuteChangedFor] [NotifyDataErrorInfo] [NotifyPropertyChangedRecipients] 

Antiguamente:

private string? firstName;

public string? FirstName
{
    get => firstName;
    set
    {
        if (SetProperty(ref firstName, value))
        {
            OnPropertyChanged(nameof(FullName));
            GreetUserCommand.NotifyCanExecuteChanged();
        }
    }
}

private string? lastName;

public string? LastName
{
    get => lastName;
    set
    {
        if (SetProperty(ref lastName, value))
        {
            OnPropertyChanged(nameof(FullName));
            GreetUserCommand.NotifyCanExecuteChanged();
        }
    }
}

public string? FullName => $"{FirstName} {LastName}";

Ahora:

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
[NotifyCanExecuteChangedFor(nameof(GreetUserCommand))]
private string? firstName;

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
[NotifyCanExecuteChangedFor(nameof(GreetUserCommand))]
private string? lastName;

public string? FullName => $"{FirstName} {LastName}";

MVVM Toolkit se ocupará de la generación de código para esas propiedades, incorporando toda la lógica necesaria para llevar a cabo el cambio de propiedad especificado o ejecutar eventos de cambio.

Cuando se utiliza [ObservableProperty] para generar propiedades observables, MVVM Toolkit ahora también creará dos métodos parciales sin implementaciones: On<PROPERTY_NAME>Changing y On<PROPERTY_NAME>Changed. Estos métodos pueden emplearse para introducir lógica adicional cuando se produce un cambio en una propiedad, sin necesidad de recurrir al uso de una propiedad manual. Es relevante tener en cuenta que, dado que estos dos métodos son parciales, anulados y sin definición, el compilador de C# los eliminará completamente si no se implementan. Esto significa que, cuando no se utilicen, simplemente desaparecerán y no añadirán carga adicional a la aplicación.

Ejemplo:

[ObservableProperty]
private string name;

partial void OnNameChanging(string name)
{
    Console.WriteLine($"The name is about to change to {name}!");
}

partial void OnNameChanged(string name)
{
    Console.WriteLine($"The name just changed to {name}!");
}

Naturalmente, también eres libre de implementar solo uno de estos dos métodos, o ninguno. A partir de ese fragmento anterior, el generador de código fuente producirá un código similar a este:

public string Name
{
    get => name;
    set
    {
        if (!EqualityComparer<string>.Default.Equals(name, value))
        {
            OnNameChanging(value);
            OnPropertyChanging();
            name = value;
            OnNameChanged();
            OnPropertyChanged();
        }
    }
}

partial void OnNameChanging(string name);

partial void OnNameChanged(string name);

El atributo [ObservableProperty] también incorpora la posibilidad de validación: si alguno de los campos que representan una propiedad tiene uno o más atributos heredados de ValidationAttribute, estos se replicará automáticamente en las propiedades generadas. Por ende, este enfoque también es completamente compatible cuando se utiliza ObservableValidator para crear formularios que se pueden validar. Si además desea que la propiedad se valide cada vez que se establezca su valor, puede agregar [NotifyDataErrorInfo] para que se genere código de validación en el estabilizador de propiedades.

Cancelación para comandos

Se ha incorporado una nueva propiedad [RelayCommand] al atributo, que se puede usar para indicar al generador de código fuente que genere un comando de cancelación junto con el comando original. Este comando de cancelación puede ser empleado para cancelar la ejecución de un comando asíncrono.

Esto también muestra cómo [RelayCommand] puede ajustarse automáticamente a métodos asíncronos y métodos que aceptan parámetros, creando implementaciones de comandos asincrónicos en segundo plano. Además, permite funciones adicionales, como una configuración fácil de enlace para mostrar indicadores de progreso.

Ejemplo:

[RelayCommand(IncludeCancelCommand = true)]
private async Task DoWorkAsync(CancellationToken token)
{
    // Do some long running work with cancellation support
}

creado por el snippet;

AsyncRelayCommand(DoWorkAsync);

ICommand? doWorkCancelCommand;

public ICommand DoWorkCancelCommand => doWorkCancelCommand ??= IAsyncRelayCommandExtensions.CreateCancelCommand(UpdateSomethingCommand);AsyncRelayCommand(DoWorkAsync);

ICommand? doWorkCancelCommand;

public ICommand DoWorkCancelCommand => doWorkCancelCommand ??= IAsyncRelayCommandExtensions.CreateCancelCommand(UpdateSomethingCommand);

Conclusiones

En este lanzamiento del .NET Community Toolkit, hemos explorado las diversas características que amplían las posibilidades de desarrollo en la plataforma .NET. Desde herramientas de interfaz de usuario hasta utilidades esenciales, estas características ofrecen mejoras sustanciales en la productividad de los desarrolladores. No obstante, este solo marca el inicio de nuestra exploración. En la siguiente entrega, nos sumergimos aún más en las funcionalidades del toolkit, destacando cómo abordar desafíos comunes y facilitar el proceso de desarrollo .NET. Prepárate para descubrir más soluciones valiosas que mejoran la experiencia de desarrollo y consolidan al .NET Community Toolkit como una herramienta esencial para la comunidad.

Fernando Sonego

Deja una respuesta

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