Вопрос о шаблоне DTO / Command
-
19-09-2019 - |
Вопрос
Была очень интересная дискуссия по Потерянные технологии в отношении AutoMapper (аргумент за / против двухстороннего отображения).
Это действительно привлекло мое внимание из-за проблемы, над которой я сейчас работаю.Я работаю над отправкой товара, чтобы предоставить моим пользователям такую информацию, как тарифы / сроки доставки.Чтобы централизовать фактические сервисы, у меня есть веб-служба WCF, которая сохраняет любые объекты домена.
Чтобы упростить модель предметной области, у меня в основном есть 2 класса:
public class Shipment
{
public IList<Item> Items{get;set;}
}
public class Item
{
//some primitive properties
}
У меня также есть соответствующий набор DTO, которые были созданы для уменьшения нагрузки на провод.В части презентации (или фрагментах, независимо от того, что касается веб-службы) используются DTO без знания модели предметной области.
Мой вопрос возникает здесь.Чтобы создать отправку, служба принимает список товаров.В создании отправлений есть своя логика, которая полностью скрыта за веб-сервисом.По сути, это означает, что ItemDTO передается по сети (клиент -> сервер), создаются посылки, затем ShipmentDTO передается обратно (сервер -> клиент).Теперь ShipmentDTO также имеет дочерний список ItemDTO, который создает сценарий двухстороннего сопоставления.
Это больше, чем простая операция CRUD, и я совсем новичок в шаблоне командных сообщений, поэтому мне любопытно, как сообщество решит эту проблему.
Передаете ли вы DTO в оба конца с помощью двухстороннего сопоставления?
Пример использования (уровень представления):
List<ItemDTO> list = new List<ItemDTO>();
//add items to list
ShipmentServiceClient client = new ShipmentServiceClient();
List<ShipmentDTO> shipments = client.GetShipments(list);
//shipments are now displayed to the user
//with respective costs and other useful data
Решение
Кое-что, что было упомянуто в этом посте, но я не совсем понял, была формулировка в ответе."Входящие DTO сопоставляются с командными сообщениями".Говоря, DTO могут быть двунаправленными, однако предоставляемые сопоставления (AutoMapper) являются однонаправленными.
Другие советы
Рискуя упустить суть вашего вопроса, я скажу, что использовать DTO двунаправленно нормально, если вы не используете DTO повторно по неправильной причине.В вашем случае запрос к серверу на создание отправки для группы товаров полностью заполняет каждый ItemDTO, так что, когда сервер получает его обратно, ITEMDTO в основном одинаковы?Или вы действительно запрашиваете отправить несколько товаров, но возвращаемый ItemDTO содержит некоторые дополнительные данные, заполненные сервером (напримерстоимость доставки каждого товара, состояние запасов и т.д.)?В последнем случае я бы сказал, что вам не следует повторно использовать ItemDTO для представления как конкретного товара, запрашиваемого для отправки, так и сведений о доставке товара.