На мой взгляд, вы должны ВСЕГДА использовать 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 и т. Д.)
Отличный вопрос! –