Middle
Co je to injekce závislostí (DI) v ASP.NET Core?
sobes.tech AI
Odpověď od AI
Vstřikování závislostí (DI) je návrhový vzor pro inverzi řízení (IoC), který umožňuje vytvářet slabě propojený kód. V ASP.NET Core je DI vestavěnou funkcí, která usnadňuje správu závislostí mezi třídami.
Hlavní komponenty DI v ASP.NET Core:
- Služby: Objekty poskytující funkčnost (například třídy repozitářů, služby logování).
- DI kontejner: Objekt odpovědný za řešení závislostí a tvorbu instancí služeb.
- Životní cyklus služeb: Určuje, kdy a jak jsou vytvářeny instance služeb:
- Transient: Nová instance je vytvořena při každé žádosti o službu.
- Scoped: Jedna instance na každou žádost (pro webové aplikace — na každý HTTP požadavek).
- Singleton: Instance je vytvořena při první žádosti a používá se po celou dobu běhu aplikace.
Výhody používání DI:
- Slabé propojení: Třídy závisí na abstrakcích (rozhraních), nikoliv na konkrétních implementacích.
- Testovatelnost: Je snadné nahradit reálné závislosti "mocks" nebo "stubs" při jednotkovém testování.
- Rozšiřitelnost: Je snadné nahradit implementace služeb bez změny kódu, který na nich závisí.
- Správa závislostí: Kontejner DI spravuje životní cyklus a tvorbu instancí.
Příklad registrace služeb v Startup.cs (nebo Program.cs v .NET 6+):
// V metodě ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
// Registrace služby s životním cyklem singleton
services.AddSingleton<ILogger, EmailLogger>();
// Registrace služby s životním cyklem scoped
services.AddScoped<IDataRepository, SqlDataRepository>();
// Registrace služby s životním cyklem transient
services.AddTransient<ITransientService, TransientService>();
// Registrace kontrolerů pro injekci závislostí
services.AddControllersWithViews();
}
Vstřikování závislostí v konstruktoru kontroleru:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI automaticky řeší a vkládá tyto závislosti
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... akce kontroleru
}