Преимущества использования трехуровневой архитектуры - PullRequest
1 голос
/ 14 июля 2010

Я понимаю преимущества трехуровневой архитектуры (например, изменение кода на одном уровне обычно не влияет на код на двух других уровнях), но я не понимаю, почему для UI layer было бы плохой идеей (в определенных обстоятельствах) непосредственно получить доступ к `уровню данных.

a) Я могу представить несколько причин, по которым UI должен говорить только с BLL layer:

  • thisКстати, UI разработчику не нужно знать подробности DB schema, поскольку BLL layer абстрагирует таблицы БД с помощью пользовательских объектов.

  • также, часто BLL layer обрабатывает / проверяет входящие данные перед передачей их на другой слой

Есть ли другие причины?

b) Но если один и тот же разработчик пишет все три уровня, то действительно ли есть причины, по которым UI layer не должен иметь прямой доступ к data layer (в тех случаях, когда ему не нужно BLL layer дляобрабатывать / проверять данные)?

спасибо

Ответы [ 5 ]

4 голосов
/ 14 июля 2010

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

3 голосов
/ 14 июля 2010

Если вы оставите слои несвязанными, вы можете отключить такие компоненты, как ядро ​​базы данных, без перекодирования вашего уровня пользовательского интерфейса.Точно так же, даже если средний уровень не должен обрабатывать / проверять данные, его можно использовать для получения дополнительных данных из других источников (других баз данных, сетевых ресурсов и т. Д.) Без перекодирования уровня пользовательского интерфейса.практика, чтобы не отставать.Это позволяет вам изменять масштаб вашей системы или регулировать ее с минимальным воздействием на другие элементы.

2 голосов
/ 14 июля 2010

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

  • Минимизировать влияние изменений
  • Проверьте свой код

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

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

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

С другой стороны, их называют «лучшими практиками» по определенной причине.

2 голосов
/ 14 июля 2010

Security.BLL должен быть доступен от клиента и раскрывать только те методы, которые вы хотите, чтобы люди на клиенте использовали.Как вы надежно храните строку подключения к базе данных в коде клиента?

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

Я предполагаю,пользовательский интерфейс - это клиентское приложение, а не веб-сайт.

1 голос
/ 15 июля 2010

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

При проведении архитектурных обзоров я часто нахожу трехуровневую архитектуру пользовательского интерфейса / BLL / DAL, как вы описали, и очень часто ни по какой другой причине, кроме как "все это делают", "это путь Microsoft" и т. Д. и так далее. Это хорошая архитектура (или шаблон слоя), но она не универсальна (так как в ИТ ее нигде не существует).

Несколько вопросов, которые приходят на ум: где живут пользовательские объекты, которые "абстрагируют таблицы БД" (цитата), и на каком уровне вы их выставляете? Являются ли эти DTO или объекты из BLL, которые заполнены DAL? Пользовательский интерфейс знает эти объекты (прямая ссылка) или они скрыты BLL? Являются ли объекты в BLL постоянными осведомленными? Как выглядят ваши ссылки между уровнями? Рисование картины высокого уровня может помочь здесь.

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

Несколько предложений: если вы собираетесь продвинуться в этом, попробуйте явно отделить операции чтения от записей (запросы от команд, вопросы от транзакций, выберите ваш язык). Альтернативой связыванию пользовательского интерфейса с DAL может быть создание самого сервисного уровня (как это для неоднозначного термина? На самом деле, именно поэтому я иногда называю этот уровень «Операциями», не для чего иного, кроме как для устранения неоднозначности), что может либо получить нужные объекты непосредственно из уровня доступа к данным, либо вызвать бизнес-уровень, когда этого требует операция. Таким образом, вы по-прежнему определяете все взаимодействие между пользовательским интерфейсом и базовой инфраструктурой одним способом, но вы можете оптимизировать каждую операцию в отдельности.

...