Разработка DAL и BLL - один / несколько хранилищ данных для связанных таблиц
При разработке нового многоуровневого приложения я сталкиваюсь с трудностями при принятии решения о дизайне моего слоя DAL и BLL.
Предположим, у меня есть информация о сотрудниках, распределенная по нескольким таблицам, имеющая отношения 1-1 и 1-Многие с основной таблицей. Немногие перечислены ниже:
Сотрудник (Master Table),
Employee_Contact_Detail,
Employee_Education,
EMPLOYEE_SKILL,
Employee_Experience
На уровне DAL у меня есть общий репозиторий данных, предоставляющий общие функции, такие как GetAll, GetSingle, Add, Edit, Delete для каждой таблицы.
Теперь я должен спроектировать свой "Репозиторий данных о сотрудниках", полученный из моего "Репозитория универсальных данных", и добавить функции для всех связанных таблиц, перечисленных выше, в одном классе, таком как GetEmployeePersonalDetail, GetEmployeeContactDetail, GetEmployeeEducation, AddEmployeePersonalDetail, EditEmployeePersonalDizetail Inlight IntainLighttail I очень меньшая выгода для "репозитория общих данных". Другой способ заключается в том, что я создаю (и извлекаю из универсального репозитория) отдельный репозиторий данных для каждой таблицы, а затем создаю отдельный класс на уровне бизнес-логики для "Сотрудника".
РЕДАКТИРОВАТЬ
Если я выберу "отдельный репозиторий данных для каждой таблицы", на уровне DAL, а затем вместо "одного класса бизнес-логики" для "Сотрудника", если я создам отдельные классы бизнес-логики, соответствующие каждому репозиторию данных, это будет неприличный подход с учетом сценария?
Большое спасибо за ваше руководство.
1 ответ
Как уже упоминалось в комментарии к вашему вопросу, это мое мнение.
Проблема:
Если у вас уже есть базовый репозиторий, зачем создавать определенный репозиторий для каждой таблицы? Опять же, в BLL, вы создаете отдельный Service
класс ("класс бизнес-логики", как вы упомянули) для каждого хранилища. Это все повторяющаяся работа, которую трудно понять и понять.
Предложение:
Вы не упомянули, какой ORM вы используете (если есть); поэтому я предполагаю, что ваш ORM предоставляет необходимые функции для реализации архитектуры ниже.
Я предлагаю вам закрыть свой DAL в общем хранилище. Не пишите классы DAL для определенных таблиц. Все ваши классы обслуживания будут использовать общий DAL для основных функций CRUD. Все расширенные функциональные возможности должны быть реализованы в самом классе Service.
Что касается классов обслуживания, то вместо создания одного класса для каждого Репозитория / Таблицы снова повторяют работу. Лучше сгруппировать связанные таблицы (Repository не может быть рассмотрен со ссылкой на вышеприведенный абзац) в одном сервисе.
Например, вы создаете общий DAL, который обслуживает основные функции для всех таблиц. Вы создаете EmployeeService
это охватывает все таблицы, связанные с вашим сотрудником. Вы создаете AccountService
это покрывает всю вашу связанную бухгалтерскую таблицу. Так же, LogService
для всех действий, связанных с ведением журнала. Это облегчает взаимодействие со службами, так как вы получаете всех связанных участников в одном классе. Это также уменьшает повторную работу.
Присылайте мне этот и этот вопросы и их принятые ответы.
Я надеюсь, что это объясняет вашу озабоченность.
Редактировать 1
Как уже упоминалось в вашем комментарии, вы нас EF. Он поддерживает необходимые функции для реализации того, что я предложил.
реализация расширенной функциональности в BLL вместо DAL будет перекрывать роли уровня
Да; оно делает. Другая сторона тоже такая же. Когда вы пишете DAL для каждой таблицы, вы фактически пропускаете Business Logic в DAL. В случае каких-либо изменений в бизнес-логике, вам нужно изменить DAL, что не имеет смысла.
По моему предложению, хотя слои перекрываются, проблемы по-прежнему раздельные. DAL обрабатывает только CRUD. BLL обрабатывает всю логику, включая логику базы данных.
Использовали ли вы одну и ту же стратегию в своих проектах?
Да. В некоторых проектах ранее я создавал отдельный DAL для каждой таблицы вместо общего DAL. Это вызвало огромную повторную работу. Хотя проекты были относительно небольшими, накладные расходы были больше. Несколько месяцев назад я начал с относительно большого проекта, в котором реализовал то, что предложил выше. Мы можем видеть облегчение, которое дало нам сейчас.