Cześć,
chciałem się zapytać czy jest jakaś znacząca różnica między services.AddSingleton w C# a zmienną globalną np. w C++ poza tym, ze zmienna globalna wydaje się wygodniejsza w użyciu (pomijam kwestie związane z wielowątkowością etc.)?
Bo jeśli dobrze rozumiem wstrzykiwanie zależności to singleton ma właśnie pełnić funkcję takiej wszędzie dostępnej zmiennej globalnej(?). Czy może się mylę i nie o to tu chodzi?
Różnica jest o tyle znacząca, że zależność od wstrzyknięto Singletona da się normalnie przetestować. Do zmiennej globalnej podobny jest bardziej klasyczny Singleton, jak klasa z polem statycznym z instancją singletona.
Ale w ogólności to tak - Singleton jest w pewnym sensie globalny.
Warto zwrócić uwagę na to, że globalnosc nie jest zawsze zła - np. ISessionFactory
z NHibernate rejestruje się jako Singleton, bo nie ma sensu za każdym razem tworzyć nowego.
Różnica jest taka że masz obiekt który nie ma kopii (pracujesz na oryginalne) vs zmienna którą możesz nie tylko odczytać ale również zmienić w każdym momencie.
Zresztą porównanie sposobu programowania do cech języka programowania mija się troszkę z celem
W C++ również masz singleton
https://4programmers.net/C/Artyku%C5%82y/Generyczny_singleton_w_C++
Singleton to próba zrobienia zmiennej globalnej w językach w których nie ma zmiennych globalnych.
Względnie, jest to próba zrobienia zmiennej globalnej w języku mającym zmienne globalne, ale tak by nie nazywać tego zmienną globalną i nadal mimo wyznawania poglądu "zmienne globalne są be" czuć się dobrze.
Dziękuję za odpowiedzi.
Moje pytanie wynikało z faktu, że nie jestem pewny czy dobrze rozumiem ideę DI i jaki cel pełni.
Nie mam doświadczenia w testowaniu, więc być może faktycznie w tym zakresie ma to jakieś uzasadnienie.
fasadin napisał(a):
Różnica jest taka że masz obiekt który nie ma kopii (pracujesz na oryginalne) vs zmienna którą możesz nie tylko odczytać ale również zmienić w każdym momencie.
Czy mógłbyś troszkę rozwinąć myśl - nie bardzo rozumiem co napisałeś :/. Poza tym zmienną globalną również można tak stworzyć, aby maksymalnie zabezpieczyć się przed złym wykorzystaniem.
Odnośnie Singletona i zmiennej globalnej to jeśli dobrze rozumiem równie dobrze można utworzyć zmienną statyczną (to można zrobić również w C#) - i efekt powinien być ten sam.
Tak jak AddSingleton można odwzorować przez zrobienie zmiennej statycznej tak w przypadku AddTransient jest równoznaczne z każdorazowym wywołaniem new - więc nie bardzo rozumiem uzasadnienia dla DI w tym kontekście - chyba, że właśnie poza testowaniem, gdzie można łatwo podmienić klasy.
Pozostaje jeszcze AddScope - to chyba jedyna opcja, którą jestem wstanie jakoś uzasadnić poza kwestiami testów.
Zmienna globalna można zabezpieczyć? To proszę zabezpiecz mi void *ptr :) ja jedynie zrobię coś takiego (gdzieś w kodzie więc nie wiesz jaki stan aplikacji)
ptr = null
Jestem ciekawy jak przed czymś takim zabezpieczyć zmienną
DI nie ma nic wspólnego z testowaniem.
To że dzięki DI łatwiej się testuje to jest konsekwencją tego jak DI działa.
DI to jest koncept architektoniczny/projektowy
Singleton to jest wzorzec projektowy
A zmienna globalna to zmienna którą możesz użyć w każdym momencie
Przy DI nie jest to możliwe. Chociażby nie możesz wywołać singletona z do jako pierwsza instrukcje w main jako że di nawet jeszcze nie zarejestrowało niczego
Static w c# to nie to samo co zmienna globalna, jest spora różnica. Chociażby ze w c# wszystko jest obiektem (tak nawet int). Mimo że wydaje się że osiągaja ten sam cel sposób jest zupełnie rozny.
W o wielowątkowości nie wspomnę bo tu zmienna globalna ma bardzo mało do powiedzenia :D
Testy piszesz pod wszystko, nie ważne czy do czy nie.
Możesz sobie wszystkie powiązania klas robić w jakieś metodzie i nadal klasa będzie testowalna (choć dziwna)
Trochę nie rozumiem twojego konta "zagubienia w pytaniu"