В конце концов, этот тип решения сводится к предпочтению (очевидно), но это также напоминание о том, что каждое архитектурное решение должно быть прослежено до определенной цели. Эти цели или требования могут иметь множество предпосылок, от бизнес до технических, но важный момент заключается в том, что они должны быть там, по той простой причине, что всякий раз, когда вы обнаруживаете, что подвергаете сомнению конкретные детали (решения) в имеющейся архитектуре, вы может проследить мотивацию решения.
При проведении архитектурных обзоров я часто нахожу трехуровневую архитектуру пользовательского интерфейса / BLL / DAL, как вы описали, и очень часто ни по какой другой причине, кроме как "все это делают", "это путь Microsoft" и т. Д. и так далее. Это хорошая архитектура (или шаблон слоя), но она не универсальна (так как в ИТ ее нигде не существует).
Несколько вопросов, которые приходят на ум: где живут пользовательские объекты, которые "абстрагируют таблицы БД" (цитата), и на каком уровне вы их выставляете? Являются ли эти DTO или объекты из BLL, которые заполнены DAL? Пользовательский интерфейс знает эти объекты (прямая ссылка) или они скрыты BLL? Являются ли объекты в BLL постоянными осведомленными? Как выглядят ваши ссылки между уровнями? Рисование картины высокого уровня может помочь здесь.
Некоторые причины не делать то, что вы предлагаете, уже были опубликованы; в то время как все они действительны, каждое возражение может быть смягчено обходным путем (или 10). Учитывая сложившуюся ситуацию, я на самом деле предпочитаю делать что-то в этом духе, делая доступ к данным как можно более архитектурным. Я считаю, что это делает решение гибким и подходящим для изменения при изменении требований (как они всегда делают).
Несколько предложений: если вы собираетесь продвинуться в этом, попробуйте явно отделить операции чтения от записей (запросы от команд, вопросы от транзакций, выберите ваш язык). Альтернативой связыванию пользовательского интерфейса с DAL может быть создание самого сервисного уровня (как это для неоднозначного термина? На самом деле, именно поэтому я иногда называю этот уровень «Операциями», не для чего иного, кроме как для устранения неоднозначности), что может либо получить нужные объекты непосредственно из уровня доступа к данным, либо вызвать бизнес-уровень, когда этого требует операция. Таким образом, вы по-прежнему определяете все взаимодействие между пользовательским интерфейсом и базовой инфраструктурой одним способом, но вы можете оптимизировать каждую операцию в отдельности.