.Net Core ASP - Dependency Injection - serwis jako singleton, czy zwykły obiekt?

0

Cześć, jestem nowy w świecie ASP. Widzę, że mogę w pliku Startup.cs zarejestrować serwisy. Tylko teraz pytanie. Jakie są za i przeciw rejestrowania tych serwisów jako singletony lub zwykłe klasy. Czyli jakie są faktycznie różnice między czymś takim:

services.AddScoped<IToDoItemService, FakeToDoItemService>();

a tym:

services.AddSingleton<IToDoItemService, FakeToDoItemService>();

Osobiście WYDAJE mi się, że wersja z singletonem będzie działała szybciej. Chociażby dlatego, że singleton zostanie utworzony tylko raz przy pierwszym wywołaniu. Natomiast w pierwszej wersji, tworzony jest obiekt przy każdym wywołaniu. A jeśli taki serwis ma w sobie jeszcze inne zależności, to one też będą tworzone przy każdym wywołaniu i może zrobić się niezła sieka.

Czy mój tok rozumowania jest poprawny? Czy są jakieś KONKRETNE "przeciw" jeśli chodzi o rejestrację serwisów jako singletony?

1

To zależy jakie masz zależności. Jeżeli w zależnościach masz np. DbContext, który nie jest thread-safe to nie możesz zarejestrować jako singleton, bo kolejne requesty HTTP są wywoływane w innych wątkach co będzie skutkowało błędami. Natomiast jeżeli masz jakiś bezstanowy serwis (np. jakaś logika do obliczeń czegokolwiek) to spokojnie możesz zarejestrować jako singleton.

3

Dokonując wyboru kompletnie nie patrz na wydajność, tylko na to czy stan tego serwisu (jeśli go ma) ma być dzielony pomiędzy requestami czy nie.

1
Mateusz napisał(a):

To zależy jakie masz zależności. Jeżeli w zależnościach masz np. DbContext, który nie jest thread-safe to nie możesz zarejestrować jako singleton, bo kolejne requesty HTTP są wywoływane w innych wątkach co będzie skutkowało błędami.

Tu nie o wątki chodzi, bo przede wszystkim, to DbContext służy do wykonania unit of work, a tenże dzielony między wieloma requestami byłby nieskończonym kretynizmem - użytkownicy aplikacji nadpisywali by sobie wzajemnie dane.

Natomiast jeżeli masz jakiś bezstanowy serwis (np. jakaś logika do obliczeń czegokolwiek) to spokojnie możesz zarejestrować jako singleton.

Zgoda, chociaż moim zdaniem serwis to jest właśnie coś stanowego, co wykonuje operacje przekazane z kontrolera. Operacje bezstanowe to raczej jakieś utilsy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1