С архитектурной точки зрения, устраняет ли необходимость в отдельном слое доступа к данным уровень абстракции базы данных, такой как Microsoft Entity Framework?


11

Как это было

В течение многих лет я организовывал свои программные решения как таковые:

  • Уровень доступа к данным (DAL) для отвлечения бизнеса от доступа к данным
  • Уровень бизнес-логики (BLL) для применения бизнес-правил к наборам данных, обработки аутентификации и т. Д.
  • Утилиты (Util) - это просто библиотека общих утилитных методов, которые я создал со временем.
  • Уровень представления, который, конечно, может быть веб, настольным, мобильным и прочим.

Так оно и есть сейчас

В течение последних четырех лет я использовал Microsoft Entity Framework (я в основном являюсь разработчиком .NET) и обнаружил, что наличие DAL становится более обременительным, чем чистым, из-за того, что Entity Framework уже выполнила Работа, которую выполнял мой DAL: он абстрагирует бизнес от запуска CRUD для базы данных.

Итак, я обычно получаю DAL, у которого есть набор методов, подобных этому:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

Затем в BLL этот метод используется как таковой:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

Конечно, это простой пример, поскольку в BLL, как правило, применяется еще несколько строк логики, но просто кажется слишком излишним поддерживать DAL для такой ограниченной области.

Не лучше ли просто отказаться от DAL и просто написать мои методы BLL как таковые:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

Я рассматриваю возможность исключения DAL из будущих проектов по причинам, указанным выше, но прежде чем сделать это, я хотел бы опросить сообщество здесь, чтобы узнать о ваших взглядах / предвидениях / мнениях, прежде чем приступить к реализации проекта и обнаружить проблему, которую я не обнаружил. не ожидаю.

Любые мысли приветствуются.

Обновить

Похоже, что консенсус заключается в том, что отдельный DAL не нужен, но (делая мой собственный вывод здесь) хорошая идея, чтобы избежать блокировки поставщика. Например, если у меня есть DAL, который абстрагирует вызовы EF, как показано выше, если я когда я переключаюсь на другого поставщика, мне не нужно переписывать свой BLL. Только те базовые запросы в DAL должны быть переписаны. Сказав это, мне трудно представить сценарий, в котором это произойдет. Я уже могу сделать EF-модель базы данных Oracle, MSSQL - это данность, я вполне уверен, что MySql также возможен (??), поэтому я не уверен, что дополнительный код когда-либо даст достойную рентабельность инвестиций.


3
Чем отличается уровень доступа к данным от EF? Разве EF не является уровнем доступа к данным? Единственные причины, по которым я могу видеть вашу собственную абстракцию между вашей бизнес-логикой и EF, - это упрощение тестирования и предотвращение блокировки поставщика.
Marjan Venema

2
Это моя точка зрения - с моей точки зрения нет никакой разницы, но я ищу контрапункты. Спасибо.
Мэтт Кашатт

3
Лично я не вижу причин для создания отдельного DAL, потому что EF / NHibernate сами по себе являются слоями доступа к данным. Как упоминал Марьян, с EF вы можете учитывать это, если видите, как меняется поставщик базы данных, в NHibernate вы можете поменять драйверы в одной строке кода (даже драйвер SQLite для тестирования в памяти), так что это будет (IMO) ненужный код.
Патрик Свик

3
Не нужно иметь два DAL. Как уже говорили другие, сохраняйте свой BLL, но будьте осторожны, чтобы не связывать свой BLL с конкретными конструкциями поставщика. Мне всегда нравится видеть, как все сводится к строковому или целочисленному уровню. Тогда я знаю, что мог бы легко показать весь переход BLL / DAL через очень примитивный канал, такой как веб-сервисы, последовательный порт, телеграфный канал, просто шучу.
Andyz Smith

1
Обновление: этот дополнительный слой может значительно упростить юнит-тесты бизнес-слоя, потому что издеваться / заглушки / подделки GetMyObjects(int myId)легче, чем издеваться / заглушки / подделки GetObjects.Where(ob => op.accountId == myId).ToList().
k3b

Ответы:


6

Не уверен, что это ответ, который вы ищете .. но здесь идет.

Мы делаем это, чтобы держать вещи отделенными / организованными. Да, EF / NHibernate - это доступ к данным ... но мы ограничиваем его использование собственной сборкой с общей настройкой репозитория. Эта сборка также содержит все наши отображения NHibernate, фабрику сессий, код для обработки нескольких баз данных и т. Д.

Мы по-прежнему называем его «Уровень доступа к данным», потому что вся сборка существует для поддержки нашего ORM.

Я должен, вероятно, отметить, что наше основное приложение ссылается на 5 баз данных, имеет примерно 4-500 доменных объектов / отображений и различные схемы. Таким образом, эта настройка имеет смысл для нас. Возможно, для небольшого приложения вы бы пропустили эту сборку, но .. Я не люблю организованный код и, вероятно, все равно это сделаю :)


2

Я рассматриваю EF и DAL как отдельные компоненты в системе Enterprise. Уровень доступа к данным - это абстракция, которую другие службы используют для обеспечения сохранности данных и управления ими. Как правило, Entity Frameworks создают хороший API вокруг запросов, обновления, удаления и вставки, однако в ядре им все еще требуется прямое соединение с внутренним источником данных. Таким образом, любой тип маршрутизации или межсетевые экраны будут мешать работе EF, поэтому вам потребуется создать компонент-посредник EF.

Вот высокоуровневый пример, показывающий, где подходят DAL и EF:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

По моему опыту, лучший дизайн - никогда не позволять бизнес-логике или реализациям сервисов иметь прямой доступ к уровню EF. Вместо этого, чтобы предоставить абстракцию для работы со всеми постоянными данными, которая позволяет отправлять запросы по сети или выполнять их локально.

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

Некоторые вопросы, чтобы задать:

  • Смогут ли все компоненты, имеющие доступ к вашим данным, получить соединение с внутренним хранилищем данных?
  • Позволяет ли ваш EF объединять наборы данных в разных типах хранилищ данных? Например, используя базу данных SQL с MongoDB для документов.

1

В настоящее время вопрос о том, собираетесь ли вы менять хранилище данных, более интересен, чем раньше, поскольку вопрос может быть не просто в том, будете ли вы переключаться между MS SQL или Oracle SQL, а в том, важнее ли вы. может использовать один из различных предложений хранения данных NoSQL в качестве хранилища данных.

Если существует серьезная возможность такого рода изменений, может быть полезно сохранить код EF изолированным в вашем DAL, чтобы в будущем вы могли представить новый DAL, который отобразил бы ваши запросы репозитория в базе данных NoSQL. Может случиться так, что такое изменение в конечном итоге приведет к полной перезаписи вашего BLL из-за допущений, связанных с БД, которые, конечно, закрадываются.

Точно так же EF в DAL, вероятно, сделает более простым моделирование доступа к данным для ваших модульных тестов кода BLL.

Поэтому я считаю, что EF (или другие ORMS) не обязательно отменяют необходимость в уровне доступа к данным.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.