Я разрабатываю приложение N-уровня на C #. Сторона сервера состоит из следующих слоев:
- Уровень доступа к данным (EF Code First Entities и DbContext)
- Бизнес-уровень (содержит всю бизнес-логику и объекты)
- Уровень службы WCF (службы, созданные для каждого вызова, которые предоставляют некоторые операции из бизнес-уровня)
Теперь запросы клиентов обрабатываются таким образом:
- Клиент создает запрос DTO и отправляет его на уровень обслуживания
- Уровень сервиса отображает этот DTO на бизнес-объект и вызывает метод BL.
- Бизнес-уровень делает что-то полезное, делает запросы к DAL, а затем возвращает некоторый бизнес-объект в службу.
- Уровень сервиса сопоставляет бизнес-объект с ответом DTO и возвращает клиенту
Он отлично работает, несмотря на дублирование кода, которое смягчается Automapper. Актуальная проблема заключается в следующем:
Клиент показывает одни и те же объекты в разных представлениях: сетке, форме и т. Д. Например, для представления сетки (списка) требуются только идентификатор и имя из объекта «Пользователь», а для представления «Форма (подробности)» требуется каждое свойство пользователя. Но бизнес-уровень ничего не знает о представлениях. Он может только предоставить полный объект UserBL для вызовов службы, и тогда ответственность за отображение этого UserBL в UserListDto или UserDetailsDto входит в обязанности службы. А для некоторых тяжелых объектов получение дополнительных полей из БД становится проблемой производительности.
Итак, должен ли бизнес-уровень предоставлять разные методы для разных клиентских операций? Мне не нравится это решение, потому что оно похоже на загрязнение логики предметной области, но я не знаю, что еще можно сделать.