Cześć wszystkim :)
Zacząłem pisać swoją pierwszą większą aplikację w .Net Core, która docelowo ma być klonem Youtube. Zanim zacząłem tworzyć strukturę projektu, poczytałem sobie jak dobrze zaprojektować architekturę aplikacji i poczytałem sobie o clean architecture.
Jedną z funkcjonalności będzie możliwość subskrybowania użytkowników, a to wymaga stworzenia relacji many-to-many obiektów tej samej klasy (User). Przy modelowaniu bazy danych używam podejścia code-first w EF Core, a ten z kolei wymaga utworzenia dodatkowej klasy umożliwiającej takie mapowanie.
I tutaj pojawia się moja zagwozdka. Bo obiekt ten nie jest z pewnością częścią domeny, powinien być powiązany z częścią projektu odpowiedzialną za persystencję. Nie mogę go natomiast po prostu tam umieścić, bo wtedy obiekt domenowy User będzie zależny od klasy spoza domeny.
Jedyne co przychodzi mi do głowy to utworzenie (prawie zduplikowanie) zestawu klas z domeny razem z informacjami potrzebnymi do zapisu do BD i mapowanie pomiędzy tymi obiektami a domenowymi. Lub mógłbym odtworzyć tam tylko klasę User, ale to chyba nie jest dobre rozwiązanie bo wtedy każdy pipeline zawierający zapytania do BD byłby różny przy zapytaniach dotyczących Usera i wszystkich pozostałych. Z drugiej strony jeśli stworzę takie obiekty dla wszystkich obiektów domenowych, mimo że nie jest to potrzebne (przynajmniej na razie) to nie jest to łamanie DRY i YAGNI? Jakie jest wg. Was najlepsze rozwiązanie takiego problemu?
(Póki co to mapowanie zrobione jest przez obiekt Subscription w folderze ValueObjects, to jest oczywiście do zmiany).
I jeszcze drugie pytanie.
Inną z funkcjonalności będzie możliwość dawania łapek w górę/dół pod filmem/komentarzem.
Zrobiłem osobne obiekty dla lajków pod wideo, dislajków pod wideo i to samo dla komentarzy. Każdy z nich zawiera tylko autora danego lajka i film/komentarz, do którego został dodany i nic więcej. Czyli w praktyce są to również obiekty mapujące ze sobą 2 wiersze z dwóch innych tabel (czyli 2 inne obiekty domenowe). I właśnie nie jestem pewny co do tego czy powinienem traktować je jako obiekty domeny (value objects, gdyż nie muszą być w żaden sposób identyfikowalne) czy tak jak w przypadku wyżej traktować je jako obiekt stricte mapujący i przenieść do projektu z infrastrukturą. Wydaje mi się, że poprawna jest pierwsza opcja, ale nie mam pewności.
Jeśli macie jakieś dodatkowe uwagi jak można by coś zrobić lepiej to też chętnie przygarnę :)
Tutaj jest link do aplikacji: https://github.com/Qbelek/BlueTube