Анонсирован выпуск .NET Community Toolkit 8.0

от автора

.NET Community Toolkit — это коллекция классов-хелперов и API, которые могут использовать все .NET — разработчики и которые не зависят от конкретной платформы пользовательского интерфейса.

Toolkit поддерживается и публикуется Microsoft и является частью .NET Foundation.

.NET Community Toolkit — это наследник Windows Community Toolkit. Его появление разработчики объясняют следующим образом: со временем росло число библиотек API, использующих .NET и при этом не рассчитанных на работу с Windows. Поэтому было принято решение выделить отдельный проект, чтобы иметь возможность развиваться независимо и быть доступным для .NET-разработчиков не для Windows.

Так как последняя версия Windows Community Toolkit перед выделением нового проекта была 7.1.x, то было решено первый релиз .NET Community Toolkit обозначить как 8.0.0. В дальнейшем оба проекта будут развиваться и версионироваться независимо. 

Библиотеки, входящие в .NET Community Toolkit:

  • CommunityToolkit.Common

  • CommunityToolkit.Mvvm (aka “Microsoft MVVM Toolkit”)

  • CommunityToolkit.Diagnostics

  • CommunityToolkit.HighPerformance

Одним из самых важных компонентов Toolkit’a является MVVM Toolkit. В его основе лежит MVVMLight, ранее крайне популярная библиотека для разработки приложений с использованием паттерна MVVM (в настоящий момент не поддерживается). Для тех, кто до сих пор использует MVVMLight, есть план перехода на Microsoft MVVM Toolkit.

В двух словах о новых возможностях в версии 8.0.0 в плане именно MVVM Toolkit’a.

Заявлено интенсивное использований генераторов кода (source generators), что позволит сократить количество boilerplate-кода.

при объявлении и реализации Commands:
было:
private IRelayCommand<User> greetUserCommand;  public IRelayCommand<User> GreetUserCommand => greetUserCommand ??= new RelayCommand<User>(GreetUser);  private void GreetUser(User user) {     Console.WriteLine($"Hello {user.Name}!"); }

стало:
[RelayCommand] private void GreetUser(User user) {     Console.WriteLine($"Hello {user.Name}!"); }

при объявлении и реализации Observable properties:
было:
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}";

стало:
[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}";

Также при использовании атрибута [ObservableProperty] MVVM Toolkit сгенерирует два метода: On<PROPERTY_NAME>Changing и On<PROPERTY_NAME>Changed

Таким образом, конструкция вида

[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}!"); }

развернётся в

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);

Ссылка на оригинальный анонс.

Ссылка на документацию.

Ссылка на демонстрационное приложение в Microsoft Store.


ссылка на оригинал статьи https://habr.com/ru/articles/681002/