Мы создаем веб-приложение, используя AngularJS, С#, ASP.Net Web API и Fluent NHibernate. Мы решили использовать DTO для передачи данных на уровень представления (angular views). У меня было несколько сомнений относительно общего структурирования и обозначения DTO. Вот пример, иллюстрирующий мой сценарий. Допустим, у меня есть объект домена Customer, который выглядит следующим образом:
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; }
}
Теперь, в моем представлении/слое представления, мне нужно получить различные вкусы клиента, например:
1) Идентификатор и имя 2) Идентификатор, имя и адрес 3) Идентификатор, имя, адрес и учетные записи
Я создал набор DTO для выполнения этого:
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; }
}
AddressDetails и AccountDetails являются DTO, которые имеют все свойства своих соответствующих объектов домена.
Это отлично подходит для запросов и извлечения данных; вопрос в том, что я использую для вставок и обновлений. Во время создания новой записи клиента имя и адрес являются обязательными, а учетные записи являются необязательными. Иными словами, мне нужен объект со всеми свойствами клиента. Отсюда путаница:
1) Что я могу использовать для вставки и обновления? В CustomerWithAddressAndAccounts DTO есть все, но его имя кажется немного неудобным для вставки/обновления.
2) Я создаю еще один DTO.. если я это сделаю, не будет ли это дублирование, поскольку новый DTO будет точно таким же, как CustomerWithAddressAndAccounts?
3) И последнее, но не менее важное: описывает ли описанное выше наследование наследования DTO как подходящее для этого требование? Есть ли другие способы моделирования этого?
Я прочитал другие сообщения по этой теме, но не смог добиться больших успехов. Одна вещь, которую я делал, заключалась в том, чтобы избежать использования суффикса "DTO" в именах классов. Я думаю, что это немного лишнее.
Хотелось бы услышать ваши мысли
Спасибо