Windows Community Toolit 제공하는 MVVM Kit

반응형

Windows Community Toolit은 유용한 도우미 기능, 사용자 지정 컨트롤 및 앱 서비스 모음입니다. 여기서 제공하는 MVVM Kit는 Windows에 종속성이 없어 다양한 플랫폼에서 사용할 수 있는데요, 특히 .NET 5 이상에서 좀 더 최적화 되었다고 합니다.

 

The Windows Community Toolkit is a collection of helpers, extensions, and custom controls. It simplifies and demonstrates common developer tasks building .NET apps with UWP and the Windows App SDK ...

MVVM을 사용하기 위해 Windows Community Toolkit에서 제공하는 MVVM 툴킷을 사용할 수 있는데요, Microsoft.Toolkit.Mvvm 패키지로 NuGet에서 내려받아 사용할 수 있습니다. 최신 버젼은 7.1.0입니다.

MVVM을 편하게 사용하려면 IoC를 써야 하는데요, Ioc.Default를 통해 사용할 수 있고 IServiceProvider제공하는 IoC라면 ConfigureServices()를 통해 적용할 수 있습니다.

서비스 등록

서비스 등록은 Microsoft.Extensions.DependencyInjection에서 제공하는 ServiceCollection을 통해 합니다.

var s = new ServiceCollection();

// ViewModel, View 등록 {
s.AddTransient<MainViewModel>();
s.AddTransient<MainPage>();

s.AddTransient<SettingViewModel>();
s.AddTransient<SettingPage>();

// 어플리케이션 Context 등록
s.AddSingleton<IAppContext>(new AppContext());

// 자원 서비스 등록
s.AddSingleton<IResourceService>(new ResourceService());

Ioc.Default.ConfigureServices(s);

AddSingleton()은 싱글톤으로 하나의 개체를 계속 사용하고
AddTransient()은 서비스를 요청할 때마다 개체를 생성하는 대상을 등록합니다.

일반적으로 서비스는 AddSingleton()으로, 뷰모델은 AddTransient()으로 등록하나 필수는 아니며 목적에 맞게 사용할 수 있습니다.

서비스 사용

IoC가 ConfigureServices()에 의해 필요시 등록된 서비스를 사용할 수 있게 되면 등록된 서비스를 GetService()에 의해 IoC에서 가져올 때 의존성 주입(Dependency Injection)이 자동으로 이루어 집니다. 단, 주입 대상은 반드시 등록된 서비스여야 하는데요, 이런 식입니다.

| 가장 일반적인 생성자 주입(Constructor Injection)

public SettingViewModel(IConfiguration config, IStorage storage) { ... }

여기서 SettingViewModel, IConfiguration, IStorage는 모두 서비스로 등록되어 있어야 합니다.

그런데 여기서 인터페이스 형태가 보이는데요, 의존성 주입의 장점이 서비스를 등록할 때 인터페이스와 대상유형 또는 인스턴스를 매칭해서 등록하면 사용하는 쪽에서 대상을 특정하지 않고 인터페이스로 접근이 된다는 점입니다.

생성자가 아닌 속성에 Attribute를 줘서 주입하는 방법도 있습니다.

| 속성의 Attribute를 통해 의존성 주입
보통 InjectAttribute를 통해 자동으로 주입 하는데요,

[Inject]
private IConfiguration Config { get; }

MVVM 툴킷은 지원하지 않는 것 같습니다.

ObservableObject

MVVM 툴킷은 ObservableObject을 통해 관찰 가능한 개체를 생성할 수 있습니다.

 

A base class for objects of which the properties must be observable

INotifyPropertyChanged, INotifyPropertyChanging 인터페이스를 구현한 기본 클래스이며, 뷰모델을을 이 클래스에서 상속받아 만들 수 있습니다.

class SettingViewModel : ObservableObject
{
...
}

속성이 변경되었을 때 외부에서 관찰할 수 있게 하려면 다음과 같이 할 수 있습니다.

class SettingViewModel : ObservableObject
{
      private bool _isSaved;
      public bool IsSaved
      {
          get => _isSaved;
          set => SetProperty(ref _isSaved, value);
      }
}

SetProperty()에 의해 IsSaved값이 변경되었음을 외부에서 관찰할 수 있도록 합니다.

소스 생성기를 이용한 간결한 관찰 기능 구현

MVVM 툴킷이 이제 소스 생성기를 이용한 간결한 Attribute를 통해 관찰 가능을 손쉽게 구현할 수 있게 되었습니다.

class partial SettingViewModel : ObservableObject
{
      [ObservableProperty]
      private bool _isSaved;
}

 

소스 생성기의 정책에 의해 개발자의 코드를 수정하지는 않습니다. 그래서 자동 생성된 코드와 잘 결합하도록 하려면 클래스에 partial을 줘야 하고 해당 Attribute를 필드에 줘야 합니다. isSaved 또는 _isSaved 필드의 [ObservablePropery] Attribute를 통해 IsSaved 속성을 생성하고 관찰 가능한 코드를 자동 생성하게 됩니다.

반응형