Должен ли я преобразовывать объекты Entity (Persistent) в объекты DTO?
Мой проект разбит на слои следующим образом:
DAL (Entity)
-> BLL (DTO)
-> ApplicationComponent (ViewModel)
.
Будет несколько компонентов приложения ( ApplicationComponent
), которые будут иметь доступ к BLL
. Компоненты include службы Windows, веб-службы, веб-API и controller MVC.
- EntityManager закрыт
- Указание индекса (не-уникальный ключ) с использованием JPA
- Я обнаружил, что JPA, или, похоже, не поощряет шаблон DAO
- В чем разница между однонаправленными и двунаправленными ассоциациями JPA и Hibernate?
- Какова лучшая страtagsя для модульных приложений, управляемых базами данных?
Я преобразовываю объекты NHibernate
Entity
объекты DTO
, передавая их из DAL
в BLL
. При передаче этого состояния в ApplicationComponent
BLL
снова преобразует его в ViewModel
.
Это помогает мне разделить проблемы и то, как данные обрабатываются на каждом уровне. Я не хочу вернуть объект NHibernate
Entity
для просмотра по следующим причинам:
- Данные получают доступ к
UI
который я хочу скрыть (или только разоблачить, если необходимо), например, пароли, тип пользователя, разрешение и т. Д. - В ссылках / объединениях
NHibernate
выполняет дополнительные запросы при доступе к ресурсу, которые сводят на нет использование ленивой загрузки. - Ненужные данные, открытые пользователю (
Entity
), создают путаницу и разрыв в ошибках. - Реализации реализаций в
BLL
/UI
.Entity
не предназначен дляUI
. Он не может обслуживатьUI
во всех случаях. - Мы используем атрибуты свойств
DTO
для проверки ввода пользователя, которая выглядит нечетно сEntity
.
Перед этим я сталкиваюсь с следующими проблемами:
- Самая большая и очевидная проблема – избыточные объекты с одинаковой функциональностью.
- Мне нужно написать методы сопоставления на каждом уровне для преобразования объекта. Это можно свести к минимуму с помощью
AutoMapper
или чего-то подобного; но это не полностью разрешает проблему.
Вопросов: –
- Разве это разделение и его следует избегать (по крайней мере, свести к минимуму)?
- Если этот подход верен, я не вижу простого способа полностью обойти две проблемы, о которых я говорил выше. Пожалуйста, предложите.
- Если этот подход неверен, предложите исправления.
Рекомендации: –
-
Link1 предлагает передать объект
Entity
для просмотра, который в моем понимании не является хорошей идеей. -
Link2 предлагает отобразить
Entity
сDTO
что я уже согласен. -
Link3 не помогает.
-
Link4 предлагает использовать что-то вроде инструментов auto mapper, которые в порядке. Но он все еще не решает проблему полностью.
-
Link5 – отличная статья . Это объясняет, почему они должны быть отдельными, и я согласен. Он не комментирует, как минимизировать накладные расходы, вызванные им.
-
Link6 снова не помогает.
Изменить 1:
Я просто прочитал этот отличный ответ, который предлагает использовать Entity
как есть в UI
если это возможно . Он по-прежнему не распространяется на большинство моих проектов.
Изменить 2:
Еще одна отличная статья предлагает перейти к отображению двух способов, как я делаю сейчас. Он по-прежнему не предлагает способ минимизации накладных расходов.
- Почему вы должны использовать ORM?
- Может ли Hibernate работать с синтаксисом «ON DUPLICATE KEY UPDATE» MySQL?
- Что такое «постоянство невежества»?
- Какой ORM я должен использовать для Node.js и MySQL?
- Сохранение карты с использованием JPA
- Как создать таблицу объединений с аннотациями JPA?
- JPA - сохранение отношения от одного до большого
- Как вы можете делать пейджинг с NHibernate?