.net 5 UnitOfWork i zapętlone referejnce

0

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?

2

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ą).

0

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?

0

Dlaczego uważasz, że to jest UoW?

0

A nie jest?

3

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.

1

Ż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

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