Windows Community Toolit은 유용한 도우미 기능, 사용자 지정 컨트롤 및 앱 서비스 모음입니다. 여기서 제공하는 MVVM Kit는 Windows에 종속성이 없어 다양한 플랫폼에서 사용할 수 있는데요, 특히 .NET 5 이상에서 좀 더 최적화 되었다고 합니다.
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
을 통해 관찰 가능한 개체를 생성할 수 있습니다.
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
속성을 생성하고 관찰 가능한 코드를 자동 생성하게 됩니다.