2015-12-15 16 views
2

Я разрабатываю приложение N-Tier в C#. Серверная часть состоит из этих слоев:Как избежать избыточной бизнес-логики (выборка БД) при создании DTO?

  • слоя доступа к данным (EF Code First Entities и DbContext)
  • Бизнес слоя (содержит всю бизнес-логику и объекты)
  • слой
  • службы WCF (за вызов instanstiated услуг, раскрыть некоторые операции с бизнес-слоя)

Теперь клиентские запросы обрабатываются таким образом:

  1. Клиент создает запрос DTO и отправляет его на слой Service
  2. Service слой отображает это DTO для бизнес-объекта и вызывает метод BL
  3. Бизнес-слой делает что-то полезное, делает запросы к DAL, а затем возвращает некоторый бизнес-объект для обслуживания
  4. Сервисный слой отображает бизнес-объект в DTO. Ответ и возврат к клиенту.

Он работает хорошо, несмотря на дублирование кода, которое смягчается Automapper. Фактическая проблема заключается в следующем:

Клиент отображает те же объекты в разных представлениях: сетка, форма и т. Д. Например, для представления сетки (списка) требуется только объект Идентификатор и имя от объекта пользователя, в то время как вид формы (подробностей) имущество. Но бизнес-уровень ничего не знает о представлениях. Он может предоставлять полный объект UserBL только для вызовов службы, а затем ответственность за обслуживание заключается в том, чтобы сопоставить этот UserBL с UserListDto или UserDetailsDto. И для некоторых тяжелых объектов получение дополнительных полей из БД становится проблемой производительности.

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

+0

Рассматривали ли вы использование кеширования на клиенте? Особенно, если вы снова получаете одну и ту же информацию из сервисного уровня. Насколько неустойчивы эти данные? –

ответ

2

Клиент показывает те же объекты в разных представлениях: сетка, форма и т. Д. Например, для представления сетки (списка) требуется только объект Идентификатор и имя от объекта пользователя, а вид формы (подробности) - это свойство каждого пользователя. Но бизнес-уровень ничего не знает о представлениях. Он может предоставлять полный объект UserBL только для вызовов службы, а затем ответственность за обслуживание заключается в том, чтобы сопоставить этот UserBL с UserListDto или UserDetailsDto. И для некоторых тяжелых объектов получение дополнительных полей из БД становится проблемой производительности.

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

Что касается вашей проблемы с дублированием кода. Это не дублирование. Эти разные представления пользователя имеют разные обязанности .

  • DTO: Ответственный передачи пользователю и создавая слабую связь между бизнес-слоем и потребителем
  • БО: Ответственный герметизирующего и выполнение деловых операций
  • БД лицо: Ответственный делает BO объектно стойкими невежественный

Таким образом, если вы использовали бы только одно представительство пользователя, вы объединили бы все эти обязанности и, следовательно, должны были жертвовать в хорошем дизайне, чтобы иметь возможность использовать его каждый. Единственное, на самом деле выигрыш в том, что вам нужно написать несколько строк меньше кода. Помните об этом, когда начинаете поддерживать выпущенное приложение. Вы сохранили несколько строк, но получили гораздо более жесткое приложение для поддержки.

+0

«Обычно я возвращаю различные представления бизнес-объекта в зависимости от типа действия, которое сделано в BL». Я думаю, это то, что я буду делать. В любом случае будет некоторая логика сортировки страниц \ сортировки в BL, даже если это не чистая логика домена (или я ошибаюсь?) – v1rusw0rm

+0

«Что касается вашей проблемы с дублированием кода, это не дублирование. Эти разные представления пользователя имеют разные обязанности. " Это именно то, что я думаю при создании разных объектов для разных слоев, даже если эти объекты выглядят очень похожими. Я не объяснил это в вопросе, потому что это немного не в тему. И я только что упомянул об этом, потому что некоторым разработчикам это не нравится, утверждая, что это нарушает принцип DRY. – v1rusw0rm

+0

Это здорово, что вы тоже это знаете. Так же, как вы встречаемся с несколькими разработчиками, которые хотят использовать один и тот же объект. – jgauffin

 Смежные вопросы

  • Нет связанных вопросов^_^