Xamarin.Forms + Prism – Dependency Injection

Wstęp

Dzisiejszy post będzie troszkę nawiązywał do poprzedniego, o dependency injection link.Xamarin Forms nie posiada żadnego wbudowanego mechanizmu do dependency injection więc aby to osiągnąć potrzebujemy dodatkowych bibliotek. Ja w swoim projekcie korzystam z Prism. Autorzy biblioteki utworzyli warstwę abstrakcji Prism.Ioc – jest to zestaw interfejsów do obsługi kontenerów. Dzięki temu rozwiązaniu mogą powstawać pakiety dla kontenerów np. Unity, Ninject itp. Oczywiście jest to tylko teoria, założenie jest słuszne, niestety nie wszystkie kontenery są kompatybilne o czym możemy poczytać w dokumentacji Prism na GitHub – link. Jak już zdecydujemy z którego kontenera chcemy skorzystać to musimy zainstalować odpowiedni pakiet nuget. Ja korzystam z Unity dlatego też przykład będzie w oparciu o ten kontener. Instalujemy paczkę Prism.Forms.Unity. Przedstawiałem już wcześniej jak przygotować projekt do korzystania z Prism – link. Pamiętajmy, że każdy widok z którego chcemy korzystać, musi być zarejestrowany w kontenerze, w metodzie RegisterTypes.

containerRegistry.RegisterForNavigation<HomeView>();

Zależności

Wszystkie zależności rejestrujemy również w metodzie RegisterTypes. Utwórzmy repozytorium IHomeRepository i dodajmy je do naszego HomeViewModelu. Utwórzmy jedną właściwość title i odczytajmy ją z repository.

public interface IHomeRepository
{
    string GetTitle();
}
public class HomeViewModel : BindableBase, INavigationAware
{
    private readonly IHomeRepository _homeRepository;

    private string _title;

    public string Title
    {
        get { return _title; }
        set
        {
            _title = value;
            RaisePropertyChanged();
        }
    }

    public HomeViewModel(IHomeRepository homeRepository)
    {
        _homeRepository = homeRepository;
    }

    public void OnNavigatedFrom(INavigationParameters parameters)
    {

    }

    public void OnNavigatedTo(INavigationParameters parameters)
    {
        Title = _homeRepository.GetTitle();
    }

    public void OnNavigatingTo(INavigationParameters parameters)
    {

    }
}

Ja w przykładzie rozszerzyłem mój view model o interfejs INavigationAware żeby mieć dostęp do metod nawigacji. Kolejny krok to zarejestrowanie IHomeRepository, w App.xaml.cs w metodzie RegisterTypes. W zależności od potrzeb, możemy zarejestrować typ zwyczajnie, jako singleton, a nawet możemy podać konkretną instancję jaka ma być przypisana. TestHomeRepository zwraca po prostu tekst Hello Unity!

containerRegistry.Register<IHomeRepository, TestHomeRepository>();
containerRegistry.RegisterSingleton<IHomeRepository, TestHomeRepository>();
var homeRepository = new TestHomeRepository();
containerRegistry.RegisterInstance<IHomeRepository>(homeRepository);

Po wykonaniu powyższych kroków, Prism podczas tworzenia obiektu HomeViewModel oraz innych view modeli automatycznie przypisze zarejestrowane wcześniej właściwości.

Przykładowy kod jest dostępny na GitHub – link

Scroll to Top