Wątek przeniesiony 2022-03-05 17:23 z C# i .NET przez somekind.

architektura projektu (Onion)

0

zrobiłem sobie taki podział solucji
Core
- Domain
- Enums
- Repositories ( kontrakty )
Infrastructure
- DAO
- DTO
- Migrations
- Repositories ( implementacje)
Services
- Exceptions
- Middleware
WebApi
.....

wpakowałem się w coś takiego, że nie mam dostępu do dto, które przekazuję z frontu w wartwie Core ( ta warstwa nie zależy od niczego)
Czy flow powinien wyglądać tak "reuqest - odbieram dto w controlerze - wołam serwis, który przyjmuje dto - serwis np używa repozytorium ale tutaj już nie przekazuję dto jako parametr tylko rozbrajam dtosa"? Czy może jednak kontrakty repozytoriów lecą do innej warstwy?

p.s. chciałbym także podbić ten wątek .NET 6, EF + Dapper

6

Jeśłi chcesz mieć architekturę cebulkową to jak najbardziej nie będziesz miał w jej sercu(u Ciebie core) dostępu do obiektów pochodzących z widoku input/output modeli (u Ciebie zwanych DTO).
I jak dobrze zauważyłeś orkiestrację na obiektach biznesowych robisz w warstwie wyżej, czy to bezpośrednio w kontrolerach czy w serwisach aplikacyjnych jeśli takowe posiadasz.
Mapowanie pomiędzy jednymi obiektami a drugimi jest naturalną rzeczą w takich wypadkach.

5

wpakowałem się w coś takiego, że nie mam dostępu do dto, które przekazuję z frontu w wartwie Core ( ta warstwa nie zależy od niczego)

No i prawidłowo, bo tak to powinno wyglądać w Onion Architecture. Kierunek zależności powinien być odwrócony i warstwy najbardziej w środku nie powinny bezpośrednio być zależne od elementów w warstwach zewnętrznych. To co musisz zrobić to zmapować DTO które przyjmujesz w API na model domenowy (w Core). Takie mapowanie może brzmieć jak nadmiar pracy ale taki sens warstw żeby rozbić te rzeczy- DTO może mieć coś typowego dla requestu (np. atrybuty walidacji) podczas kiedy model domenowy nie- ale może mieć coś czego z kolei DTO mieć nie powinno, np. jakąś dynamiczną właściwość (tylko getter) zwracający jakąś informację o stanie modelu.

1
john_doe napisał(a):

Czy może jednak kontrakty repozytoriów lecą do innej warstwy?

Kontraktem repozytorium mogą być tylko i wyłącznie encje domenowe. Jeśli masz tam jakieś DTO, to to nie są żadne repozytoria tylko DAO.

2

Podejrzewam że kontrakty repozytoriów == interfejsy. A więc interfejsy powinny znajdować w warstwie domenowej.

4

@scibi_92: te interfejsy repozytoriów na jakichś obiektach muszą operować. I tymi obiektami nie mogą być DTO tylko encje domenowe.

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