ViewModel Locator w Prism 9.0
ViewModel Locator w Prism 9.0 to technika i narzędzie, które upraszcza proces przypisywania ViewModel do widoków w aplikacji WPF (Windows Presentation Foundation) lub innych aplikacjach opartych na Prism. Używa się go w kontekście aplikacji korzystających z wzorca MVVM (Model-View-ViewModel), w celu oddzielenia logiki prezentacji (ViewModel) od interfejsu użytkownika (View).
Główną rolą ViewModel Locator jest dynamiczne przypisywanie odpowiedniego ViewModel do View. Pozwala to na łatwiejsze zarządzanie zależnościami między widokami i modelami widoków, a także umożliwia wykorzystanie kontenerów zależności (Dependency Injection) w celu automatycznego wstrzykiwania zależności.
Jak działa ViewModel Locator?
ViewModel Locator działa na zasadzie mapowania nazw widoków (Views) na odpowiadające im ViewModel. Zasadniczo, kiedy dany widok jest tworzony, ViewModel Locator automatycznie przypisuje odpowiedni ViewModel do tego widoku. Często jest to realizowane przez kontener DI (Dependency Injection), który przechowuje zarejestrowane ViewModel i tworzy je dynamicznie w momencie przypisania do widoku.
Korzyści z używania ViewModel Locator:
- Oddzielenie odpowiedzialności: ViewModel Locator pozwala oddzielić logikę aplikacji (ViewModel) od interfejsu użytkownika (View), co jest zgodne z zasadą MVVM.
- Prostota: Ułatwia przypisywanie odpowiednich ViewModel do View, eliminując potrzebę ręcznego tworzenia i przypisywania ViewModel w kodzie widoku.
- Testowalność: Ponieważ ViewModel Locator automatycznie przypisuje ViewModel do View, można łatwo testować logikę ViewModel bez zależności od widoku.
- Zależności przez Dependency Injection: ViewModel Locator współpracuje z kontenerami DI, co pozwala na automatyczne wstrzykiwanie zależności w ViewModel.
Jak skonfigurować ViewModel Locator w Prism 9.0?
W Prism 9.0, ViewModel Locator jest implementowany przy użyciu kontenera DI, który automatycznie przypisuje ViewModel do View. Działa to w sposób następujący:
- Rejestracja ViewModel w kontenerze DI: Rejestrujemy ViewModel w kontenerze DI, dzięki czemu będziemy mogli automatycznie tworzyć instancje ViewModel.
- Mapowanie View na ViewModel: Korzystamy z mechanizmu, który mapuje nazwy widoków na odpowiednie ViewModel. W Prizmie jest to realizowane przy pomocy ViewModelLocator.
- Przypisywanie ViewModel do View: Po zarejestrowaniu i powiązaniu widoku z ViewModel w kontenerze, ViewModel jest automatycznie przypisany do widoku, gdy jest on tworzony.
Przykład implementacji ViewModel Locator w Prism 9.0:
1. Rejestracja ViewModel w kontenerze DI
W App.xaml.cs lub w Bootstrapperze (jeśli używamy starszej wersji Prism), rejestrujemy nasze ViewModel w kontenerze DI, aby mogły być one wstrzykiwane do widoków.
using Prism.Ioc;
using Prism.Modularity;
using Prism.Unity;
using System.Windows;
namespace PrismApp
{
public partial class App : PrismApplication
{
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Rejestracja ViewModel w kontenerze DI
containerRegistry.RegisterForNavigation<MainView, MainViewModel>();
containerRegistry.RegisterForNavigation<AnotherView, AnotherViewModel>();
}
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
}
}
2. Utworzenie ViewModel Locator
Prism automatycznie mapuje widoki na ViewModel na podstawie ich nazw. W przypadku, gdy masz widok o nazwie MainView, Prism będzie szukać MainViewModel. Jeśli nazwy widoków i ViewModel są zgodne, nie musisz ręcznie przypisywać ViewModel do View.
Przykład MainView:
<Window x:Class="PrismApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com"
Title="PrismApp" Height="350" Width="525">
<Grid>
<TextBlock Text="{Binding Message}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
MainViewModel:
using Prism.Mvvm;
namespace PrismApp
{
public class MainViewModel : BindableBase
{
private string _message = "Hello from MainViewModel!";
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }
}
}
}
3. Automatyczne przypisanie ViewModel do View
Dzięki ViewModel Locator w Prism, kiedy tworzysz MainView, Prism automatycznie przypisuje MainViewModel do tego widoku, jeśli ViewModel jest zarejestrowany w kontenerze DI.
Dzięki temu możesz używać DataBinding w XAML, aby powiązać dane z ViewModel (np. właściwość Message z MainViewModel), a ViewModel Locator dba o przypisanie odpowiedniego ViewModel do View.
Zależności w ViewModel
Jeśli twój ViewModel ma zależności, takie jak serwisy, będą one automatycznie wstrzykiwane przez Dependency Injection w momencie tworzenia ViewModel. Dzięki temu nie musisz ręcznie tworzyć instancji zależności w ViewModel.
Przykład ViewModel z zależnością:
public class MainViewModel : BindableBase
{
private readonly IExampleService _exampleService;
public MainViewModel(IExampleService exampleService)
{
_exampleService = exampleService;
Message = _exampleService.GetMessage();
}
private string _message;
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }
}
}
Zalety używania ViewModel Locator w Prism:
- Uproszczenie przypisania ViewModel do View: Dzięki ViewModel Locator, przypisanie ViewModel do View odbywa się automatycznie, bez potrzeby ręcznego tworzenia instancji ViewModel w kodzie widoku.
- Zwiększenie testowalności: Dzięki temu, że widok i ViewModel są oddzielone, możesz testować logikę ViewModel bez potrzeby angażowania komponentów związanych z widokiem.
- Lepsza organizacja aplikacji: ViewModel Locator pomaga w utrzymaniu struktury aplikacji zgodnej z wzorcem MVVM, gdzie odpowiedzialności są dobrze rozdzielone: widok odpowiada za interfejs, a ViewModel za logikę aplikacji.
- Integracja z DI: ViewModel Locator działa płynnie w środowisku z Dependency Injection, co umożliwia łatwe zarządzanie zależnościami w aplikacji.
Podsumowanie:
ViewModel Locator w Prism 9.0 to technika, która pozwala na automatyczne mapowanie ViewModel do View, eliminując konieczność ręcznego przypisywania ViewModel w kodzie widoku. Dzięki tej funkcjonalności, aplikacja staje się bardziej modularna, łatwiejsza do testowania i bardziej zgodna z zasadami MVVM. ViewModel Locator współpracuje z kontenerem Dependency Injection, co upraszcza zarządzanie zależnościami i zapewnia automatyczne wstrzykiwanie zależności do ViewModel.