.NET Dependency Injection (DI)

Dependency Injection je návrhový vzor, který umožňuje odstranit pevné vazby mezi softwarovými komponentami. Místo přímého vytváření závislých objektů v rámci třídy, DI poskytuje tyto závislosti zvenčí, což vede k větší flexibilitě a oddělení. Ve světě C#, kde aplikace často rostou do velké komplexnosti a musí být snadno testovatelné a rozšiřitelné, je DI klíčovým nástrojem, který vývojářům pomáhá dosáhnout těchto cílů.

Pojďme si ukázat životní cykly DI služeb – jako jsou Singleton, Scoped a Transient.

Singleton

  • Životní cyklus: Instance služby Singleton je vytvořena pouze jednou za dobu existence aplikace (nebo hostitele). To znamená, že všechny požadavky a operace používají stejnou instanci služby.
  • Použití: Singleton je vhodný pro služby, které mají globální stav nebo konfiguraci, která se nemění, nebo pro služby, které vyžadují pouze jednu instanci (například logovací služby, přístup k konfiguračním souborům atd.).
  • Rizika: Je třeba být opatrný při používání stavových služeb Singleton ve vícevláknových aplikacích, protože to může vést k problémům s bezpečností vláken.

Scoped

  • Životní cyklus: Scoped služby jsou vytvořeny jednou pro každý scope, typicky pro každý HTTP požadavek v ASP.NET Core. Každý požadavek má svou vlastní instanci scoped služby.
  • Použití: Scoped služby jsou ideální pro operace, které jsou specifické pro konkrétní požadavek nebo transakci, jako jsou například databázové kontexty v Entity Framework.
  • Rizika: Scoped služby by neměly být sdíleny mezi různými požadavky, protože mohou obsahovat stav specifický pro konkrétní požadavek.

Transient

  • Životní cyklus: Transient služby jsou vytvářeny pokaždé, když jsou požadovány. To znamená, že každé vložení (injection) nebo každý požadavek na službu vytvoří novou instanci této služby.
  • Použití: Jsou ideální pro lehké, bezstavové služby. Protože jsou transient služby krátkodobé, jsou vhodné pro služby, které neuchovávají informace o stavu nebo zdroje mezi jednotlivými požadavky.
  • Rizika: Vytváření nové instance při každém požadavku může být náročné na zdroje, pokud je služba náročná na vytvoření, nebo pokud je často požadována.

Shrnutí:

  • Singleton: Jedna instance pro celou aplikaci.
  • Scoped: Jedna instance na scope (typicky na HTTP požadavek).
  • Transient: Nová instance při každém požadavku na službu.

Při návrhu aplikace je důležité pečlivě zvážit, který životní cyklus je pro každou službu nejvhodnější, aby se dosáhlo správného vyvážení mezi výkonem, bezpečností vláken a správou zdrojů.