Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:7.1.2021 11:22

Zdravím, dělám v .Net 5 webovou aplikaci a chci se zeptat na jednu věc ohledně DI. Je z nějakého důvodu problém, když místo, abych si předal závislost v konstruktoru si jí najdu pomocí tohoto příkazu?

private IServiceProvider _services;
public Test(IServiceProvider services) {
}

public void Method() {
        // Tady chci serviceprovider použít
        _services.GetRequiredServices<Abc>().AbcMethoda();
}

Předem vám děkuji za odpověď.

Zkusil jsem: Hledat na googlu, ale bohužel nevím jak přesně problém formulovat.

Chci docílit: Správné práce s DI.

 
Odpovědět
7.1.2021 11:22
Avatar
cooper538
Člen
Avatar
cooper538:7.1.2021 11:54

Ahoj, z hlediska funkčnosti to na danou třídu mít vliv nebude. Obecně se však takovýto způsob nedoporučuje, jedná se o tzv. Service Locator anti-pattern. Jednak tím znepřehledníš kód, protože nebude hned zřejmé na čem je daná třída závislá a navíc je tento přístup obtížně testovatelný.

Více info: https://stackoverflow.com/q/1557781 https://stackoverflow.com/q/1557781

Editováno 7.1.2021 11:54
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
7.1.2021 11:54
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na cooper538
Petr Kasnal:7.1.2021 12:09

Děkuju moc u webu mě to tolik netrápí. Trápí mě to ale u WPF MVVM, kde používám DI a potřebuji otevřít nové okno po klinutí na tlačítko. Pokud si předám závislost v parametru konstruktoru, tak se okno inicializuje hned což nechci, chci aby se inicializovalo až po tom klinutí...

 
Nahoru Odpovědět
7.1.2021 12:09
Avatar
cooper538
Člen
Avatar
Odpovídá na Petr Kasnal
cooper538:7.1.2021 12:40

Aha, co máš namyslí tím, že se inicializuje? Protože při injecknutí závislosti přes konstruktor se pouze dané proměnné předá reference na nově vytvořenou (nebo stávající) instanci. Vytvoření instance většinou není tak časově náročný proces. A inicializace nějakou metodou proběhne až později. Ale WPF tak dobře neznám a možná je to v tvém případě jinak :) Potom by asi bylo potřeba uvést větší kus kódu.

Editováno 7.1.2021 12:40
 
Nahoru Odpovědět
7.1.2021 12:40
Avatar
zelvicek
Člen
Avatar
zelvicek:7.1.2021 15:23

Nemáš to nejlépe, potlačuješ abstrakce.
Nastuduj si Factory pattern.

 
Nahoru Odpovědět
7.1.2021 15:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.