Cześć,
tworzę API dla nauki (C# ASP.NET). Tak wygląda moja struktura projektu:
(Główny projekt API odwołuje się też do Infrastructure, aby móc zarejestrować jego repozytoria w dependency injection).
Z tego co rozumiem, to warstwa aplikacji powinna komunikować się z bazą tylko i wyłącznie za pomocą repozytoriów z warstwy infrastruktury (... tzn. interfejsów tych repozytoriów, bo bezpośredniego dostępu do infrastruktury nie ma :). Czyli operacja dodawania klienta w aplikacji wyglądałaby tak:
public class CustomerService
{
private readonly ICustomerRepository _customerRepository;
public CustomerService(ICustomerRepository customerRepository)
...
public void AddCustomer(AddCustomerDto dto)
{
Customer c = // mapowanie DTO na encję
_customerRepository.AddCustomer(c);
}
}
Ale co z pobieraniem danych? API nie zwraca zwykle całych encji, tylko odpowiednio dostosowane klasy DTO. ChatGPT powiedział mi, że repozytoria powinny operować tylko na encjach, a nie na DTO (czy to prawda?), więc jedyne co mi zostaje to:
public CustomerDto GetCustomerById(int id)
{
Customer c = _customerRepository.GetCustomerById(id);
return // mapowanie encji na DTO
}
Ale jest to bardzo nieekonomiczne rozwiązanie, bo pobieram więcej kolumn z bazy, niż jest mi potrzebne. Bezpośrednich selectów nie mogę zrobić, bo przecież warstwa aplikacji nie ma dostępu do infrastruktury ani do bazy danych. Co zrobić w takiej sytuacji? Chat podpowiada żeby stworzyć osobne CustomerQueryRepository
, które będzie zwracało DTO, ale kiedyś na forum czytałem, że jednak niektórzy wykonują bezpośrednie selecty w serwisach.
Z góry bardzo dziękuję.