.NET

Dependency Injection

Lifetime serwisów (singleton, scoped, transient), rejestracja serwisów, IServiceProvider, najlepsze praktyki

24 pytań z rozmów·
Mid-Level
1

Jaka jest główna różnica między lifetime'ami Singleton, Scoped i Transient?

Odpowiedź

Singleton tworzy pojedynczą instancję na cały lifetime aplikacji, Scoped tworzy jedną instancję na żądanie HTTP (lub scope), a Transient tworzy nową instancję przy każdym wstrzyknięciu. Te lifetime'y określają, kiedy i ile razy kontener DI tworzy instancję serwisu. Używaj Singleton dla bezstanowych współdzielonych serwisów, Scoped dla serwisów związanych z żądaniem (jak DbContext) i Transient dla lekkich bezstanowych serwisów.

2

Którego lifetime należy użyć do zarejestrowania DbContext z Entity Framework Core?

Odpowiedź

DbContext powinien być zarejestrowany z lifetime Scoped, ponieważ nie jest thread-safe i utrzymuje stan śledzenia encji. Każde żądanie HTTP powinno mieć własną instancję DbContext, aby uniknąć problemów ze współbieżnością. Rejestracja odbywa się za pomocą AddDbContext, który automatycznie konfiguruje lifetime Scoped. Użycie Singleton spowodowałoby błędy współbieżności, a Transient marnowałby zasoby, tworząc zbyt wiele instancji.

3

Jak zarejestrować usługę z interface i jej implementacją?

Odpowiedź

Rejestracja usługi odbywa się za pomocą metod AddSingleton, AddScoped lub AddTransient, określając interface jako typ usługi, a klasę konkretną jako implementację. Składnia to services.Add{Lifetime}<IInterface, Implementation>(). To podejście przestrzega zasady odwrócenia zależności i ułatwia testowanie, umożliwiając podmianę implementacji. Kontener DI automatycznie rozwiąże konkretną implementację podczas wstrzykiwania interface.

4

W jakim przypadku należy preferować AddSingleton zamiast AddScoped?

5

Jaka jest rola IServiceProvider w systemie DI?

+21 pytań z rozmów

Opanuj .NET na następną rozmowę

Uzyskaj dostęp do wszystkich pytań, flashcards, testów technicznych, ćwiczeń code review i symulatorów rozmów.

Zacznij za darmo