Budujemy aplikację internetową za pomocą AngularJS, C#, ASP.Net Web API i Fluent NHibernate. Zdecydowaliśmy się użyć DTO do przesyłania danych do warstwy prezentacji (widoki kątowe). Miałem kilka wątpliwości dotyczących ogólnej struktury i nazewnictwa DTO. Oto przykład ilustrujący mój scenariusz. Powiedzmy mam podmiot domeny o nazwie klienta, który wygląda tak:Konwencje nazewnictwa, modelowania i dziedziczenia DTO
public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Address Address { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
}
Teraz w moich poglądów/warstwa prezentacji muszę pobierać różne smaki Klienta jak:
1) Just Identyfikator i nazwisko 2) ID, nazwa i adres 3) id, nazwisko, adres i Konta
Stworzyłem zestaw DTOs do osiągnięcia tego celu:
public class CustomerEntry
{
public int Id { get; set; }
public string Name { get; set; }
}
public class CustomerWithAddress : CustomerEntry
{
public AddressDetails Address { get; set; }
}
public class CustomerWithAddressAndAccounts : CustomerWithAddress
{
public ICollection<AccountDetails> Accounts { get; set; }
}
Dane adresowe i szczegóły konta to DTO, które mają wszystkie właściwości odpowiadających im encji domeny.
Działa to dobrze w przypadku zapytań i wyszukiwania danych; pytanie brzmi, co używam do wstawiania i aktualizacji. Podczas tworzenia nowego rekordu klienta nazwa i adres są obowiązkowe, a konta są opcjonalne. Innymi słowy, potrzebuję obiektu ze wszystkimi właściwościami klienta. Stąd zamieszanie:
1) Do czego służy wstawianie i aktualizowanie? CustomerTOithAddressAndAccounts DTO ma wszystko w sobie, ale jego nazwa wydaje się nieco niewygodna do użycia przy wstawianiu/aktualizacjach.
2) Czy mogę utworzyć kolejny DTO ... jeśli to zrobię, czy to nie będzie duplikowanie, ponieważ nowy DTO będzie dokładnie taki jak CustomerWithAddressAndAccounts?
3) Wreszcie, czy opisany powyżej schemat dziedziczenia DTO wydaje się być dobrze dopasowany do wymagań? Czy istnieją inne sposoby na modelowanie tego?
Przeszedłem inne posty na ten temat, ale nie mogłem zrobić wiele naprzód. Jedną z rzeczy, którą zrobiłem, było uniknięcie użycia przyrostka "DTO" w nazwach klas. Myślę, że to trochę niepotrzebne.
Chcielibyśmy usłyszeć wasze myśli
Dzięki
Dziękuję za odpowiedź. Jedną z motywacji do korzystania z wielu klas DTO było nieco bardziej ekspresyjne zdefiniowanie, do czego służy DTO. Ponadto, jeśli potrzebujesz tylko identyfikatora i nazwy, czy naprawdę chcesz wysłać pełnowartościowy CustomerEntryDTO (który opisałeś) przez przewód? – Sennin
@Sennin Edytowałem swoją odpowiedź na podstawie Twojego komentarza, ale myślę, że moja odpowiedź byłaby dla ciebie niekompletna. Może będę edytować go później, aby dodać więcej na powyższy komentarz. – VS1
@Sennin pls zobacz moją edycję 2. – VS1