Cześć,
Pisze apkę w .net 5 web api, zrobiłem sobie kilka klas ala XXXComponent, które oczywiście mają jakieś swoje metody. Żeby przez DI nie wstrzykiwać tych komponentów pojedynczo gdybym np. chciał w danej klasie skorzystać z kilku z nich zrobiłem sobie UnitOfWork, czyli klasę która ma jedynie properties i konstruktor który wstrzykuje dane klasy komponenty.
Klasy components oraz klasa UoW jest dodana jako AddTransient. Tylko teraz problem powstaje w momencie jakbym chciał w tego UoW skorzystać w innym komponencie, ponieważ wylatuje mi wyjątek o zapętlonych referencjach, co w sumie jest słuszne ponieważ ctor UoW(Component1) => Component1(UoW).
Czy jest jakiś sposób żeby to obejść? Może gdzieś w konfiguracji da się coś zmienić? Czy jedna jedyna opcja to korzystanie z takiego UoW tylko po za klasami które wchodzą w jego skład?
Wygląda na problem XY. Jakie dokładnie serwisy zawiera UoW? Co one robią? Dlaczego zależą od siebie nawzajem? I dlaczego istnieją klasy, które potrzebują aż tylu zależności, że chcesz je wstrzykiwać przez UoW?
O ile rozumiem, to UoW to coś na kształt service locatora. Service locator obecnie jest uważany za antywzorzec. Trudno się testuje klasy, które mają wstrzyknięty service locator. Skąd w teście będziesz wiedzieć, których zależności potrzebuje klasa, którą testujesz? Tak, można wejść do testowanej klasy i sprawdzić, ale co jak zmienią się zależności? Nie dowiesz się o tym na etapie kompilacji.
Jeśli bardzo chcesz, to Autofac wspiera wstrzykiwanie przez propertiesy i tym da się rozwiązać cykliczne referencje (to jak leczenie dżumy cholerą).
Może mam złe podejście do tego UoW, chciałem sobie ułatwić prace i zamiast wstrzykiwać raz 5 komponentów, a raz 3, wstrzykiwać zawsze wszystkie i korzystać z tych których potrzebuję. Czyli co powinienem zrezygnować z UoW które np. ma w sobie wszystkie komponenty lub UoW z wszystkimi repository i wstrzykiwać do klasy tylko te klasy których będę potrzebował? nawet jeśli się okaże że będzie to 5, 10 innych klas które będą potrzebne do zbudowania jakiejś logiki biznesowej?
Dlaczego uważasz, że to jest UoW?
A nie jest?
Pytam, bo UoW to wzorzec opakowujący transakcję biznesową. Z tego wątku wnioskuję, że Ty tak nazywasz jakiś super obiekt, który jak rozumiem przez pośrednictwo jakichś "komponentów" trzyma w sobie referencje do wszystkich klas w projekcie. To nie brzmi nawet trochę podobnie.
Ogólnie to aplikacje dzieli się na warstwy, klasy z jednej warstwy używają niektórych klas z innych warstw. Ty chyba nie masz warstw, a chcesz mieć wszystko wszędzie, stąd te problemy.
Żeby przez DI nie wstrzykiwać tych komponentów pojedynczo gdybym np. chciał w danej klasie skorzystać z kilku z nich zrobiłem sobie
Mi to brzmi bardziej na jakąś facade / wrapper