Должен ли я преобразовывать объекты Entity (Persistent) в объекты DTO?

Мой проект разбит на слои следующим образом:

DAL (Entity) -> BLL (DTO) -> ApplicationComponent (ViewModel) .

Будет несколько компонентов приложения ( ApplicationComponent ), которые будут иметь доступ к BLL . Компоненты include службы Windows, веб-службы, веб-API и controller MVC.

Я преобразовываю объекты NHibernate Entity объекты DTO , передавая их из DAL в BLL . При передаче этого состояния в ApplicationComponent BLL снова преобразует его в ViewModel .

Это помогает мне разделить проблемы и то, как данные обрабатываются на каждом уровне. Я не хочу вернуть объект NHibernate Entity для просмотра по следующим причинам:

  • Данные получают доступ к UI который я хочу скрыть (или только разоблачить, если необходимо), например, пароли, тип пользователя, разрешение и т. Д.
  • В ссылках / объединениях NHibernate выполняет дополнительные запросы при доступе к ресурсу, которые сводят на нет использование ленивой загрузки.
  • Ненужные данные, открытые пользователю ( Entity ), создают путаницу и разрыв в ошибках.
  • Реализации реализаций в BLL / UI . Entity не предназначен для UI . Он не может обслуживать UI во всех случаях.
  • Мы используем атрибуты свойств DTO для проверки ввода пользователя, которая выглядит нечетно с Entity .

Перед этим я сталкиваюсь с следующими проблемами:

  • Самая большая и очевидная проблема – избыточные объекты с одинаковой функциональностью.
  • Мне нужно написать методы сопоставления на каждом уровне для преобразования объекта. Это можно свести к минимуму с помощью AutoMapper или чего-то подобного; но это не полностью разрешает проблему.

Вопросов: –

  • Разве это разделение и его следует избегать (по крайней мере, свести к минимуму)?
  • Если этот подход верен, я не вижу простого способа полностью обойти две проблемы, о которых я говорил выше. Пожалуйста, предложите.
  • Если этот подход неверен, предложите исправления.

Рекомендации: –

  1. Link1 предлагает передать объект Entity для просмотра, который в моем понимании не является хорошей идеей.

  2. Link2 предлагает отобразить Entity с DTO что я уже согласен.

  3. Link3 не помогает.

  4. Link4 предлагает использовать что-то вроде инструментов auto mapper, которые в порядке. Но он все еще не решает проблему полностью.

  5. Link5 – отличная статья . Это объясняет, почему они должны быть отдельными, и я согласен. Он не комментирует, как минимизировать накладные расходы, вызванные им.

  6. Link6 снова не помогает.

Изменить 1:

Я просто прочитал этот отличный ответ, который предлагает использовать Entity как есть в UI если это возможно . Он по-прежнему не распространяется на большинство моих проектов.

Изменить 2:

Еще одна отличная статья предлагает перейти к отображению двух способов, как я делаю сейчас. Он по-прежнему не предлагает способ минимизации накладных расходов.

Давайте будем гением компьютера.