Załóżmy że klasa BankAccount zawiera także listę kart debetowych przypisanych do tego konta. I teraz mam dwa przypadki użycia: 1) wyświetlenie transakcji dla danego konta + numer konta, 2) wyświetlenie kart przypisanych dla danego konta + numer konta.
W repozytorium mam mieć jedną metodę GetBankAccount(int id) czy dwie które będą wykorzystywane w odpowiednich kontrolerach ?
Tam, gdzie potrzebujesz wyświetlać konto + transakcje, pobierasz konto + transakcje, a w drugim przypadku konto + karty. Jeśli konta + transakcji + kart jednocześnie nie potrzebujesz nigdzie, to tego nie pobieraj.
Jak rozumiem Twoje podejście jest takie żeby zacząć od jednej, a gdy ewentualnie będzie to powodem problemów wydajnościowych to szukać optymalizacji ?
Chyba się nie zrozumieliśmy dokładnie. W pierwszym poście pytałeś o pobieranie danych z bazy. Jak zrozumiałem, że pytasz o to, czy encję wypełniać danymi z tabel w całości, czy tylko w potrzebnej części.
Generalnie mamy trzy warstwy:
- Widok z ViewModelami
- Domena z encjami
- Baza danych z tabelami
Encje są mapowane do tabel 1:1, jeśli potrzebujesz danych z jakiegoś obiektu, to i tak pobierasz cały rekord z bazy, nie martwiąc się o to, że część kolumn pobierasz niepotrzebnie. Potem mapujesz encje na ViewModele, i tu już w zależności od potrzeb albo ustawiasz część właściwości, albo wszystkie, albo robisz jeden ViewModel z dwóch encji, itd.
Jeśli zaś pytasz o pobieranie z encją powiązanych encji, to jak już napisałem powyżej, pobieraj to, co rzeczywiście potrzebujesz. A jeśli korzystasz z ORM, pamiętaj o tym, żeby to pobrać zachłannie, żeby nie mieć problemu n+1.
Bo nie zawiera wszystkich danych. Np. dla przykładu powyżej BankAccount zwrócone do kontrolera wyświetlającego transakcje miałoby pustą listę kart.
Ale nie będziesz przecież wrzucał obiektu domenowego BankAccount do kontrolera, tylko do jednego kontrolera wyślesz BankAccountWithTransactionsViewModel, a do drugiego BankAccountWithCardsViewModel.