Cześć,
załóżmy, że mamy takie encję:
Pisane pseudokodem, nie zwracajcie uwagi na szczegóły. Liczy się idea.
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
}
Załóżmy, że dla przykładu dane w bazie wyglądają następująco:
// Już po zjoinowaniu tabeli Person i Address
[Name], [Surname], [Street]
Grzesiek, Grześkowski, Wrocławska
Grzesiek, Grześkowski, Krakowska
Kamil, Kamilowski, Poznańska
Ryszard, Kwiatkowski, NULL
Jak widać jest tutaj Grzesiek Grześkowski, który posiada dwa adresy Kamil, który posiada takowy jeden oraz Ryszard, który nie posiada wpisów w tabeli adresów, co przekłada się automatycznie na zawartość listy w klasie Person
.
No i gdzieś tam jest sobie apka, do której podłączam model z tymi encajmi, serwisami itd. W jednym z widoków potrzebuję wyświetlić sobie dane w taki sposób:
[Name], [Surname], [HasAddress]
Grzesiek, Grześkowski, true
Kamil, Kamilowski, true
Ryszard, Kwiatkowski, false
Teraz kwestia DTO i moje pytanie:
- Czy powinienem wystawić DTO, które tak naprawdę będzie wynikiem wyspecjalizowanego selecta z bazy, czyli:
public class PersonDTO
{
public int Id { get; set; }
public string Name { get; set; }
public bool HasAddress { get; set }
}
- Jeżeli tak to czy do wstawiania danych powinienem stworzyć osobne DTO posiadające jawnie kolekcję adresów (wstawić kompletnych danych przy pomocy pierwszego DTO nie można, bo nie mamy jak przekazać do serwisu informacji o adresach) np. tak:
public class PersonAlteringDTO
{
public int Id { get; set; }
public string Name { get; set; }
public List<AddressDTO> Addresses { get; set; }
}
- A może zawsze wystawiać uniwersalne DTO, takie jak
PersonAlteringDTO
i niech dopiero wyższe warstwy zajmą się odpowiednią obróbką danych? Jeżeli tak to czy kolekcja innego DTO wewnątrz nadrzędnego DTO to dobry pomysł? Może powinienem przekazać listę idków powiązanych adresów? Jest to trochę mniej problematyczne niż lista DTO reprezentująca adresy, ponieważ używając Automappera do zmapowania takiego DTO można się zapętlić i dostaćStackOverflowException
. Można oczywiście określićMaxDepth
ale czy to jest dobra droga? Jak wiadomo DTO powinno być najprostsze.
Podpowiedzcie, bo zaczynam się gubić w tym jakie dane przekazywać wyższym warstwom i jak to zrobić żeby było wygodnie również przy zmianie/wstawianiu danych.