Разрешаете ли вы веб-уровню получить прямой доступ к DAL?

Меня интересует воспринимаемая «лучшая практика», умеренная здесь с небольшой долей реальности.

В веб-приложении вы разрешаете своему веб-уровню прямой доступ к DAL, или он должен сначала пройти через BLL?

Я говорю конкретно о сценариях, в которых реально не задействована «бизнес-логика» - например, о простом запросе: «Получить всех клиентов с фамилией« Этвуд »». Сценарии, в которых есть какая-то логика, будут проходить через BLL, поэтому давайте назовем это moo.

Хотя вы можете инкапсулировать этот метод внутри объекта BLL, это кажется несколько бессмысленным, когда часто подпись будет точно такой же, как у объекта DLL, а код, вероятно, такой же простой, как однострочный делегирование запроса библиотеке DLL.

Если вы выберете первое - с использованием объекта BLL - как вы назовете эти объекты? (Предполагая, что они делают немного больше, чем предоставляют уровень запроса в DLL). Помощники? QueryProviders?

Мысли пожалуйста.

С Уважением

Марти


person Marty Pitt    schedule 28.04.2009    source источник


Ответы (7)


На мой взгляд, вам следует ВСЕГДА использовать BLL (Business Logic Layer ) между вашим веб-уровнем и DAL (уровнем доступа к данным).

Я ценю, что для некоторых из более простых запросов BLL будет точно имитировать DAL (например, Получить все страны, Получить все типы продуктов и т. Д.), Но, честно говоря, даже в вашем примере:

(Получите всех клиентов с фамилией «Этвуд»)

здесь выражается бизнес-логика - желание, чтобы записи данных фильтровались по фамилии, если не иначе!

Реализуя BLL с самого начала проекта, становится невероятно легко вставлять либо проверку, либо дополнительную логику, когда и когда может возникнуть необходимость (и если ваш проект является коммерческим приложением, эта потребность почти обязательно возникают в конечном итоге, если его нет в начале проекта). Добавление дополнительной логики, такой как:

Получите всех клиентов, которые потратили более 10000 долларов в этом году

or

Не позволяйте клиентам с фамилией «Этвуд» покупать товары на сумму более 1000 долларов.

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

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

Это разделение проблем становится все более важным, когда и если возникает необходимость в изменении пользовательского интерфейса.

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

Если бы я встроил какую-либо бизнес-логику в свой веб-уровень, мне пришлось бы дублировать и переписывать эту логику при реализации моей веб-службы. Как бы то ни было, я убедился, что вся бизнес-логика была инкапсулирована в классы BLL, а это означало, что мне просто нужно было спроектировать серию вызовов методов интерфейса веб-службы и подключить их к вызовам методов в классах BLL (на самом деле я использовал Шаблон проектирования фасадов (местами для упрощения API веб-службы).

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

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

Когда это более сложно (например, когда важная бизнес-логика существует с самого начала), разделение задач помогает уменьшить повторение (принцип DRY), в то же время значительно упрощая будущее и текущее обслуживание.

Конечно, это предполагает, что вы делаете все это вручную. При желании вы можете значительно упростить уровни DAL / BLL / UI, используя ORM коих много! (например, LINQ-to-SQL / Entities, SubSonic, NHibernate и т. д.)

person CraigTP    schedule 28.04.2009
comment
Я думаю, что пример более позднего добавления веб-службы через BLL является достаточно убедительным примером. Спасибо! - person Marty Pitt; 28.04.2009
comment
Хотя мне любопытно ваше мнение об ORM. Я использую Hibernate в своем проекте, что делает мой DAL довольно тонким, но все же имеет четкие границы между слоями. Это ваша точка зрения, или вы рассматриваете возможность объединения BLL и DAL при использовании ORM? - person Marty Pitt; 28.04.2009
comment
@Marty - Вы можете использовать некоторые из более продвинутых ORM для автоматизации DAL и большей части BLL, однако лично, если я вообще использую ORM, я позволю ему автоматически сгенерировать мой DAL и сам написать BLL. Таким образом, это избавляет меня от необходимости вручную писать DAL и позволяет мне сосредоточиться на BLL. - person CraigTP; 28.04.2009
comment
На мой взгляд, наличие четких границ между уровнями и четкое разделение проблем - главное преимущество и главное, к чему нужно стремиться, независимо от того, используется ORM или нет! - person CraigTP; 28.04.2009

Я не согласен с большинством постов здесь.

Я называю свой уровень данных на веб-уровне. Если между уровнями WEB / UI нет ничего, создавать слой «на всякий случай» нет смысла. Это предварительная оптимизация. Это бесполезная трата. Я не могу вспомнить время, когда меня «спасал» бизнес-уровень. Все, что он делал, - это создавал больше работы, дублирование и более высокое обслуживание. Я потратил годы на подписку на Business Layer -> Data Layer, передавая сущности между уровнями. Я всегда чувствовал себя грязным, создавая методы прохода, которые ничего не делали.

После того, как Эрик Эванс познакомил с доменно-ориентированным дизайном, Я делаю то, что имеет смысл. Если между пользовательским интерфейсом и уровнем данных нет ничего, я вызываю уровень данных в пользовательском интерфейсе.

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

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

У меня есть два проекта: основной проект (сущности, бизнес-логика и уровень данных) и проекты пользовательского интерфейса (веб, веб-сервисы и т. Д.)

Для получения дополнительной информации рекомендую посмотреть на этих ребят:

person Chuck Conway    schedule 28.04.2009
comment
Интересный (и странно раскрепощающий) момент. Ранняя оптимизация - это строго анти-гибкая технология. Я должен был знать, что по обе стороны забора будут веские аргументы ... теперь я должен принять собственное решение! :) - person Marty Pitt; 28.04.2009
comment
Я тоже делал "слишком много проектов" и недавно подумал, какого черта я это делаю? добавление ссылок может быть разумным количеством накладных расходов, иногда +1 - person Matt Kocaj; 07.12.2009
comment
@Marty - Обратите внимание, что хотя мы с Чаком используем разные подходы, мы оба стремимся к одной и той же конечной цели, а именно к четкому разделению проблем и возможности (относительно) легко расширять приложение при необходимости. Использование Чаком внедрения зависимостей и программирования интерфейса позволяет добиться этого так же, как и мое использование уровня BLL. - person CraigTP; 07.03.2011
comment
@CraigTP Разница в том, что при необходимости я добавляю уровень абстракции. Бизнес-уровень добавлен ради абстракции, нужна она или нет. У Айенде есть отличный пост на эту тему: ayende.com/Blog/archive/2011/03/22/ - person Chuck Conway; 22.03.2011

Вам нужно различать объекты BLL (что это вообще такое? Любые объекты домена?) И Services. Объекты вашего домена не должны иметь ничего общего с вашим уровнем доступа к данным. Что касается веб-уровня, он может обрабатывать ваши репозитории (подумайте IRepository) так же, как любой другой сервис, которым он может свободно пользоваться.

Итак, суть в следующем: да, веб-уровень может использовать DAL напрямую при условии, что он инкапсулирован в свойствах и представлен как стандартная служба уровня сервиса.

person Anton Gogolev    schedule 28.04.2009
comment
BLL - уровень бизнес-логики? - person James Anderson; 28.04.2009
comment
Ага - BLL == Business Logic Layer. Я рассматриваю их как отдельные (хотя и естественное продолжение) модели предметной области. Если это спорная точка зрения, возможно, я открою новый вопрос, чтобы узнать мнение. - person Marty Pitt; 28.04.2009
comment
Я знаю, что означает BLL. Я просто не могу согласиться с комбинацией бизнес-логики и объектов, так как я твердо верю, что бизнес-объекты должны быть лишены какой-либо логики и что логика должна быть перемещена на уровень обслуживания. - person Anton Gogolev; 28.04.2009

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

Что касается именования, у меня есть мой основной объект, скажем NameChange, затем у меня будет объект BLL, который является человеком, который принимает объект изменения имени, затем у меня будет объект DAL / Entity, называемый Person. Бизнес-объект Person находится в пространстве имен BLL, а объект DAL / Entity Person находится в пространстве имен DB (я бы выбрал DAL, если бы построил его изначально).

person cjk    schedule 28.04.2009

Мы называем этот уровень классом контроллера [слоем], который инкапсулирует DAL с веб-уровня. Уровень контроллера может иметь или не иметь никакой бизнес-логики, это помогает отделить DAL от уровня представления и сохранить их независимость [до некоторой степени].

person Vikram    schedule 28.04.2009
comment
Разве контроллер не является частью веб-уровня? - person Salman Virk; 05.03.2013

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

По сути:

Пользовательский интерфейс -> BusFacade -> BusinessLogic -> DalFacade -> DataAccessLayer

фасад обеспечивает приятный / чистый подход из пользовательского интерфейса и заставляет вас стандартизировать свои соглашения об именах, поскольку эта единственная точка входа имеет несколько методов.

BusFacade.GetCmsSiteMap()
BusFacade.GetProductGroup()

и т. д. и т. д.

person Terry_Brown    schedule 28.04.2009
comment
А в некоторых сценариях вы идете прямо BusFacade - ›DalFacade? - person Marty Pitt; 28.04.2009
comment
никогда не делал ничего - даже (как предлагалось на предыдущем постере), если это просто проход через бизнес-уровень, я бы все равно пропустил вызов, чтобы гарантировать, что, если когда-нибудь возникнет необходимость в изменении в будущем, он будет там. - person Terry_Brown; 28.04.2009

Хотя можно было бы напрямую перейти с уровня презентации на DAL, вы пропускаете BLL, который часто требует аутентификации ...

person vidalsasoon    schedule 28.04.2009