Подтвердить что ты не робот

Существует ли преимущество использования DTO, а не общей ссылки на Entities в общей сборке?

Я пытаюсь получить четкий окончательный ответ на вопрос, который долгое время меня заводил.

Общеизвестно, что BLL должен содержать Business Logic и Business Objects (BO) и иметь ссылку на DAL. DAL, с другой стороны, не может иметь ссылку на BLL, поэтому он не может принимать BO в качестве аргументов или возвращать BO как возвращаемые значения.

Самый традиционный ответ на эту проблему:

a) Принять простые параметры и вернуть (предпочтительно типизированные) DataSets и DataTables для возврата данных: пространство имен DAL { общественный класс Контакты public DataTable GetContacts() {...} public UpdateContacts (контакты DataTable) {...}

b) Вторым наиболее рекомендуемым решением является определение временных, сериализуемых объектов передачи данных (DTO) (иногда называемых объектами Value (VO)), которые имеют только поля и свойства, без методов и используются только для кратковременного переноса данные возвращаются на уровень BLL, где используются для заполнения новых BO, после чего они затем отбрасываются.

c) Используйте общую третью сборку (например, Entities.dll), которая определяет BO, и на нее ссылаются все 3 уровня: UI, BLL и DAL.

Вариант a) выполняет наименьшую работу для реализации (нет необходимости создавать еще одну сборку), поэтому почему так часто предлагаются, но DataTables имеют дополнительную проводку, которая не требуется просто для простых операций.

Однако очень неясно, какой из б) или в) лучше...

Я вижу b), предлагаемый иногда, и почти никогда не c), хотя c) кажется самым легким из двух.

Что мне не хватает? Почему c) так редко предлагается, хотя он кажется логически самым простым и почему: a) предлагается, когда его явно не подходит для всех сценариев (например, для возврата отдельных объектов)?

Спасибо!

4b9b3361

Ответ 1

Хорошо, я почти не вижу (б) на практике. Я использую подход, описанный в (c) большую часть времени (в другое время это когда я даже не разделяю между BLL/DAL или вообще не имею модель домена). В конце концов, бизнес и компоненты данных, как правило, физически расположены друг с другом, поэтому для BO они могут быть разделены этими двумя. На самом деле, такие среды, как Hibernate, Entity Framework, Linq2Sql и т.д., Действительно поощряют (c), позволяя выполнять ORM для сложной модели домена.

DTO более типично используется для передачи данных из BLL в пользовательский интерфейс, хотя, особенно. когда пользовательский интерфейс и BLL развернуты на отдельных серверах. В этом случае пользовательский интерфейс, скорее всего, нуждается в упрощенном представлении модели домена для уменьшения сквозных переходов между процессами и минимизации воздействия изменений (при изменении модели домена).

Ответ 2

ДОБАВЛЕНИЕ к оригиналу Вопрос:

Я думаю (после первого ответа, Buu Nguyenthat, следующий шаблон ссылки вполне приемлем и, возможно, даже рекомендуется с LINQ и т.д.:

BLL > 

 v    Business Entities Layer (BEL)

DAL >

Если BLL и DAL не находятся на разных уровнях, а BLL связывается с DAL через WCF...? В этом случае он не будет работать (бизнес-объекты, возвращенные DAL через WCF, будут сериализованы, а на стороне BLL будут десериализованы в Proxies исходного BE... и не будут отображаться обратно сами BE. Или это явно неправильный, и приведенная выше эталонная модель будет работать, когда BLL и DAL находятся на одном уровне, а также в разных уровнях?

ДОБАВЛЕНИЕ № 2: Нашел интересную ссылку о том, почему на самом деле хорошо использовать внешнюю сборку для BO. Он утверждает, что "это нарушение правила, что слой должен знать только об уровне ниже, а база данных, которая определяет столбец имена не находятся непосредственно ниже BLL, он ниже DAL. Поэтому не вводимые данные DataSets не защищают вас от базы данных, и поэтому я считаю, что они ошибаются. Лучшим решением было бы использовать строго типизированные объекты, определенные в отдельном проекте. например, в DTO будет класс Учителя с свойством Name, но без метода Grade."

Ответ 3

Я бы не удивился, если (с) было довольно распространено. И если ваш BLL и пользовательский интерфейс находятся на другом сервере, вы также можете передавать объекты по кабелю, если используете WCF. Взгляните на этот пример, как сделать сериализацию объектов здесь [zip] и здесь ссылка на страница загрузки. Это сообщение также может помочь с сериализации с WCF