У меня есть модель с богатым доменом, в которой большинство классов имеют какое-то поведение и некоторые свойства, которые либо вычисляются, либо раскрывают свойства объектов-членов (что означает, что значения этих свойств никогда не сохраняются).
Мой клиент говорит на сервере только через WCF.
Таким образом, для каждого объекта домена у меня есть соответствующий DTO - простое представление, которое содержит только данные, - а также класс сопоставления, который реализует DtoMapper<DTO,Entity>
, и может преобразовать объект в его эквивалент DTO или вице- наоборот через статический шлюз:
var employee = Map<Employee>.from_dto<EmployeeDto>();
Серверная часть этого приложения в основном связана с сохранением, где мои DTO поступают из службы WCF, десериализованы, а затем произвольная ORM сохраняется в базе данных или запрос запроса поступает из WCF и выполняется ORM этот запрос к БД и возвращает объекты, которые будут сериализованы и отправлены обратно WCF.
Учитывая этот сценарий, имеет смысл отображать мой хранилище персистентности в сущности домена или я должен просто сопоставлять непосредственно с DTO?
Если я использую сущности домена, поток будет
- объект запросов клиента
- WCF передает запрос серверу
- ORM запрашивает базу данных и возвращает объекты домена
- объекты домена, преобразованные в DTO с помощью mapper
- WCF сериализует DTO и возвращает клиенту
- клиент десериализует DTO
- DTO преобразован в объект домена с помощью mapper
- созданные модели и т.д.
похож на обратный ход
Если я прямо отношусь к DTO, я могу исключить одно сопоставление для каждого объекта за каждый запрос. Что я теряю, делая это?
Единственное, что приходит на ум, - это еще одна возможность проверки перед вставкой/обновлением, потому что я не гарантирую, что DTO никогда не подвергался проверке или даже существовал как объект домена перед отправкой по сети, и я думаю возможность проверки правильности выбора (если другой процесс мог помещать недопустимые значения в базе данных). Есть ли другие причины? Являются ли эти причины достаточными, чтобы гарантировать дополнительные шаги по составлению карт?
изменить:
Я сказал "произвольный ORM" выше, и я хочу, чтобы все было как можно скорее как ORM-и-persistence-agnostic, но если у вас есть что-то особенное для добавления, которое является специфичным для NHibernate, во что бы то ни стало.