Kilka pytań odnośnie IoC i DI

0

Witam!

Pogrążając się dalej w zagadnieniu MVVM, dotarłem do wzorca Dependency Injection i Inversion of Control. Odnośnie nich mam kilka pytań:

  • Jaka jest różnicą między IoC Containerem a Service Locatorem? W zasadzie oba robią to samo, rejestrują klasy, przyporządkowują je do interfejsów, tworzą i przechowują instancje. Czy sedno jest w ich sposobie użycia?
  • Załóżmy że mamy następujący ViewModel:
public class MainViewModel
{
    IService Service1;
    IService Service2;

        public MainViewModel(IService _service1, IService _service2)
        {
             Service1 = _service1;
             Service2 = _service2;
        }
}

W jaki sposób mogę wstrzyknąć obie zależności jeżeli deklarację ViewModelu mam w XAML'u? Czy zostaje tylko ręczne bndowanie do DataContextu w Code-Behind widoku? Rozumiem że przypisanie obiektów z IoC Containera bezpośrednio w konstruktorze nie będzie już wstrzykiwaniem zależności.

Proszę o podanie kilku rad dotyczących tych pytań, jest to dla mnie niezmiernie ważne - MVVM to temat który trawię już od co najmniej dwóch tygodni :)
Pozdrawiam!

0

"ViewModelu mam w XAML'u" . Widok ma być w xamlu ( są opinie, że w czystym xamlu , inni mówią , że dopuszcza się troszkę code behind ). ViewModel ma pobierać dane z Modelu i przystosowywać je do danego widoku i podawać na tacy gotowe dane dla widoku.

IoC działa w tle i zajmuje się "czasem życia obiektów" (taki mój skrót myślowy), natomiast ServiceLocator to taki helper który daje dostęp do IoC dla klas poprzez podanie nazwy wikodu. No i ma magiczną opcję Blednability. Po prostu ułatwia dostęp do poszczególnych viewModeli

0

Dzięki za odpowiedzi, w takim razie jeszcze jedna wątpliwość:

Otóż przeczytałem w kilku miejscach, że IoC Container nie powinien być klasą statyczną/singletonem - powinno się go tworzyć raz (np. w App.xaml.cs, event Startup), następnie skonfigurować go (stworzyć wiązania, ustawić parametry) i wywołać Resolve głównego obiektu (np. Core, co spowodowało by inicjalizację całego drzewa zależności). W takim wypadku Service Locator stałby się niepotrzebny (vivat anti-pattern :)), a wszystkie obiekty oprócz klasy startowej nie miały by dostępu do kontenera IoC. Czy to prawda?

0

Tak, raz przy starcie aplikacji, rejestrujesz zależności.
Rozwiązywanie zależności odbywa się "automatycznie" (bez użycia service locatora) w trakcie działania programu.

1

Serdeczne dzięki, to jeszcze na koniec ostatnie pytanie.

W jaki sposób zrealizować tworzenie nowych okien? Załóżmy że mamy WindowA, gdzie przycisk uruchamia komendę mającą za zadanie stworzyć WindowB. Normalnie wyglądało by to tak:

WindowB winB = new WindowB();
winB.Show();

Jednak wydaje mi się że nie jest to zgodne ani z ideą MVVM (niezależność warstw), ani z IoC i DI (nie operujemy na interfejsach, tylko na konkretnych klasach). Nie wywołam ich z kontenera bo ten niszczy się po stworzeniu wszystkich konstruktorów i ustawieniu zależności więc nie mam do niego dostępu. Co o tym sądzicie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1