IoC/DI hlouběji ve WPF aplikaci   zodpovězená otázka

C#, WPF

Dobrý den. Na jedné z přednášek o Inversion of Control/Dependency Injection jsem slyšel, že resolvování by mělo proběhnout pouze na jednom místě na začátku aplikace.

Dejme tomu, že mám nějaký Shell, ze kterého můžu zavolat DialogA a z DialogA můžu zavolat SubDialogA. S ohledem na MVVM pattern dialogy získávám přes nějakou WindowService pro konkrétní ViewModel.

Na začátku do Shellu nainjektuju Factory, která vrací DialogAViewModel. Ten pak použiju k získání odpovídajícího dialogu (DialogA), který zobrazím.

Chtěl bych se ale zeptat, jak se to řeší pro další úrovně? Odkud pak v DialogAViewModelu vezmu Factory pro SubDialogAViewModel, když už bych tam neměl použít DI kontejner? Jak by tedy měly vypadat ty Factory metody pro získání plnohodnotných ViewModelů i se všemi jejich závislostmi? Děkuji.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ty factories můžete kaskádovat také, tzn. do Shellu si necháte podstrčit Factory<DialogAViewModel>. Jakmile factory vytvoří instanci DialogAViewModel, tak samozřejmě automaticky provede i resolve závislostí, které jsou v tom DialogAViewModel, takže pokud do něj dáte jako depencency Factory<SubDialogAViewModel>, bude to tam.

V té factory není nic jiného než container.Resolve, jde jen o to, abyste kontejner neměl vystaven jako statický objekt přes celou aplikaci a nevolal si Resolve ze 150 míst v aplikaci a jak je libo - factory to akorát schová.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ač píšu věci, kde se DI/IOC příliš nedá využít, tato problematika mě velice zajímá.

Doufám, že se vyjádří někdo, kdo s tím má mnoho praktických zkušeností.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback