Hej,
poniżej z grubsza struktura projektu oraz uproszczony przykład pobrania zamówienia
jeśli chodzi o db założenia są takie, że widok to dane z ERP ( inna baza na tym samym serwerze sql ), tabele wiadomo.
Core
- entity ( tabelki, widoki, zdarza się powiązanie między nimi .... ef ogarnia widok as entity ) - generalnie anemiczne ... to raczej CRUD
- Interfejsy repozytoriów
Infrastruktura
- implementacje interfejsów z Core ( tutaj używam Dapper do pobrania widoków/encji )
- tutaj trzymam też DTO, które przyjmuje lub oddaje // to chyba było by dobrze przenieść do Serwisów?
- DAO - dbContext
- Migracje
Serwisy
- serwisy operuja na repozytoriach, mapują na DTO w tą i z powrotem
WebAPI
- kontrolery odpalają serwisy
Chce trzymać się zasady, że dane do bazy wrzucam przez EF a pobieram Dapperem.
Nie wiem jak ugryźć temat na przykładzie zamawiania towarów:
Order: id, number, date, customerId, ...
OrderPositions: id, sku, name, ....
Od strony dodawania zamówienia wszystko jest ok ... kontroler dostaje request, odpala serwis, serwis mapuje na obiekty domenowe, używa repozytorium - dodawanie działa.
tutaj moje schody
teraz chciałbym pobrać listę zamówień z nazwą kontrahenta i nie wiem gdzie to umieścić:
dapperem poleci query zmapowane na obiekt np. OrdersResponse
SELECT o.number, o.date, c.name FROM Orders o JOIN Customers c on o.customerId = c.id
pytanie jak to ładnie zapisać
a) tak naprawdę zapytanie sql zwróci mi jakiś obiekt nie będący obiektem domenowym - nie mogę tego umieścić w moich repozytoriach ( bo operują na domenie )
b) czy w warstwie Infrastruktury umieścić jakiś DAL i klasy realizujące takie operacje, zwracające dane? czy ok jest potem wstrzykiwanie do serwisów konkretnej klasy ( builder.Services.AddScoped<OrderService>(); )? nie widzę sensu tworzenia interfejsów pod to
- dodatkowe pytanie o "encja na twarz" - w przypadku "widok to encja", nie ma sensu przemapowywania tego na jakiś dto i w kontrolerze leci encja. czy to jest ok?
nie chciałbym teraz modyfikować mojej struktury a dodać to co potrzebuję.