2009-04-28 3 views
16

Меня интересует воспринимаемая «лучшая практика», закаленная с небольшой дозой реальности здесь.Вы разрешаете веб-уровню напрямую обращаться к DAL?

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

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

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

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

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

С уважением

Marty

+0

Отличный вопрос! –

ответ

4

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

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

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

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

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

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

или

Не позволяйте клиентам фамилии «Atwood» для покупки товаров через $ 1000

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

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

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

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

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

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

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

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

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

+1

Я думаю, что пример более позднего добавления веб-службы над BLL - достаточно убедительный пример. Благодаря! –

+0

Хотя, мне интересно, как вы относитесь к ORM. Я использую Hibernate в своем проекте, что делает мой DAL довольно тощим, но все еще имеет четкие границы между слоями. Была ли это ваша точка зрения, или вы считаете, что можно комбинировать BLL & DAL при использовании ORM? –

+0

@Marty. Вы можете использовать некоторые из более продвинутых ORM для автоматизации DAL и большей части BLL, однако лично, если я вообще использую ORM, я позволю ему автоматически генерировать DAL и написать BLL. Таким образом, это экономит мне работу, вручную записывая DAL, и давайте сосредоточимся на BLL. – CraigTP

1

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

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

2

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

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

+0

BLL - Бизнес-логический уровень? –

+0

Да - BLL == Бизнес-логический уровень. Я рассматриваю их как отдельно от (хотя и естественного расширения) модели домена. Если это спорная точка зрения, может быть, я открою новый вопрос, чтобы получить некоторые мнения. –

+1

Я знаю, что означает BLL. Я просто не могу согласиться с комбинацией «Бизнес-логика» и «Объекты», поскольку я твердо верю, что бизнес-объекты должны быть лишены какой-либо логики и что логика должна быть перенесена на сервисный уровень. –

1

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

+0

Не является частью контроллера веб-уровня? – svirk

0

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

По существу:

UI -> BusFacade -> BusinessLogic -> DalFacade -> DataAccessLayer

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

BusFacade.GetCmsSiteMap() 
BusFacade.GetProductGroup() 

etc.etc.

+0

И в некоторых сценариях вы идете напрямую в BusFacade -> DalFacade? –

+0

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

33

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

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

После введения Domain Driven Design by Eric Evans, я делаю то, что имеет смысл. Если между пользовательским интерфейсом и слоем данных нет ничего, я вызываю слой данных в пользовательском интерфейсе.

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

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

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

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

+1

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

+1

Я тоже делал «слишком много проектов» и недавно думал: «Почему, черт возьми, я это делаю?» добавление ссылок может быть разумным количеством накладных расходов иногда +1 –

+1

@Marty - Обратите внимание, что, хотя мы с Чаком используем разные подходы, мы оба нацелены на одну и ту же конечную цель, в частности на «чистое разделение проблем» и способность (относительно) легко расширить приложение, когда это необходимо. Использование Чаком инъекции зависимостей и программирования для интерфейса достигается таким же образом, как и мое использование слоя BLL. – CraigTP

0

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

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