Использование DTO и BO

Одна из вопросов для меня о DTO / BO заключается в том, когда передавать / возвращать DTO, а когда передавать / возвращать BO.

Моя интуиция подсказывает мне всегда сопоставлять NHibernate с DTO, а не с BO, и всегда передавать / возвращать DTO. Затем всякий раз, когда мне нужно было выполнить бизнес-логику, я преобразовывал свой DTO в BO.

Я бы сделал это так, что у моего BO был бы конструктор, который принимает параметр, который является типом моего интерфейса (который определяет обязательные поля / свойства), который как мой DTO, так и BO реализуют в качестве единственного аргумента.

Тогда я смогу создать свой BO, передав ему DTO в конструкторе (поскольку оба реализуют один и тот же интерфейс, они оба имеют одинаковые свойства), а затем смогу выполнять свою бизнес-логику с этим BO. Тогда у меня также был бы способ преобразовать BO в DTO.

Однако я также видел, что люди, похоже, работают только с BO и работают только с DTO в фоновом режиме, тогда как для пользователя кажется, что DTO нет.

Какие преимущества / недостатки есть у этой архитектуры по сравнению с постоянным использованием BO?

Должен ли я всегда передавать / возвращать DTO или BO или смешивать и сопоставлять (похоже, что смешивание и сопоставление могут сбивать с толку)?


person ryanzec    schedule 08.01.2011    source источник
comment
Я даже не собираюсь читать ваш вопрос, пока вы не разбиваете его на абзацы.   -  person John Saunders    schedule 09.01.2011


Ответы (3)


Это зависит от того, чего вы хотите достичь. Я могу сказать вам, что делаю сам - у меня есть как DTO, так и BO, отображенные в NHibernate, но DTO отображаются как неизменяемые, поэтому я случайно не обновляю базу данных без использования BO.

Все запросы, доступные в WebServices, возвращают / принимают DTO.

Каждый раз при обновлении из DTO я выполняю UnitOfWork, где загружаю BO, обновляю свойства из DTO и снова сохраняю их, если они все еще действительны.

На клиенте я создаю BO из DTO (AutoMapper здесь определенно правильный выбор) всякий раз, когда клиенту нужно его изменить. У BO есть ctor, который принимает все аргументы для его создания, аналогично тому, что сделал бы NHibernate.

Преимущества: * Полный контроль над объемом данных, передаваемых по сети (DTO обычно сглаживаются, поэтому при первом вызове отправляются только идентификаторы связанных классов). * Мне не обязательно иметь одинаковые свойства в обоих * Я могу смешивать и сопоставлять ленивую загрузку по своему желанию * Я могу использовать скалярные запросы и другие вычисляемые свойства в DTO, не создавая их в BO. * У меня может быть несколько разных DTO на BO для разных сценариев.

Итак, я предполагаю, что это можно квалифицировать как смешивание и сопоставление, но с четкими рекомендациями, где я что делаю :-)

Надеюсь это поможет.

person Goblin    schedule 09.01.2011

Возможно, вы найдете это: http://automapper.codeplex.com/ тоже полезным.

person Felice Pollano    schedule 09.01.2011

Я знаю, что это довольно старый вопрос, но позвольте мне дать свои «десять центов» по ​​этому поводу.

При работе с любым проектом MVC (даже с Entity Framework или NHibernate) я использую POCO для постоянства и DTO / ViewModels для промежуточной работы из-за сглаженного поведения, меньшего количества данных на проводе и, наконец (но не в последнюю очередь), они никаким образом не раскрывают отношения между объектами.

Я знаю, что это может показаться «серебряной пулей», но, по крайней мере, какое-то время у меня это работает.

(простите за несколько английских ошибок =))

person cezarlamann    schedule 30.06.2015