Объекты переноса данных против сериализации сохраняются лиц
Мне любопытно узнать, что чувствует сообщество по этому поводу. Недавно я столкнулся со сценарием NHibernate/WCF (сущности сохраняются на уровне сервиса) и понял, что здесь я, возможно, иду в неверном направлении.
Мой вопрос заключается в том, что при использовании персистентного объектного графа(NHibernate, LINQ to SQL и т. д.) За веб-службой (WCF в этом сценарии), вы предпочитаете отправлять эти сущности по проводу? Или вы создадите набор более легких DTO (без циклических ссылок) поперек?
5 ответов:
Я уже был в этом сценарии несколько раз и могу говорить по опыту с обеих сторон. Первоначально я просто сериализовал свои сущности и отправил их как есть. Это прекрасно работало с функциональной точки зрения, но чем больше я вникал в это, тем больше понимал, что отправляю больше данных, чем нужно, и теряю возможность варьировать реализацию с обеих сторон. В последующих приложениях-сервисах я перешел к созданным DTO, единственной целью которых является получение данных от и до веб-служба.
Вне любого взаимодействия, необходимость думать обо всех полях, которые передаются по проводу, очень полезна (для меня), чтобы убедиться, что я не посылаю данные, которые не нужны или хуже того, не должны попасть к клиенту.
Как уже упоминалось, AutoMapper является отличным инструментом для отображения сущности в DTO.
Я почти всегда создавал dtos для передачи по проводу и использования сущностей Рихтера на моем сервере и клиенте. На клиенте они будут иметь некоторую общую логику представления, в то время как на сервере они будут иметь бизнес-логику. Сопоставление между DTO и сущностями может быть глупым, но это должно произойти. Такие инструменты, как AutoMapper, помогут вам.
Если вы спрашиваете, отправляю ли я сериализованные сущности из веб-службы во внешний мир? тогда ответ Определенно нет, вы получите минимальную совместимость, если сделаете это. DTOs помогает решить эту проблему, определяя набор "объектов", которые могут быть созданы на любом языке, независимо от того, используете ли вы C#, Java, Javascript или что-либо еще.
У меня всегда были проблемы с отправкой nHibernate объектов по проводу. Особенно если вы используете модель ActiveRecord. и / или если ваш объект связан с сеансом (фу). Другим неприятным результатом является то, что nHibernate может попытаться загрузить объект при входе в метод (прежде чем вы сможете добраться до него), что также может вызвать проблемы.
Итак...получил сообщение здесь? проблемы, проблемы, проблемы...DTO ' s all the way
Comments