2012-07-05 3 views
4

Я строю трехуровневую архитектуру с уровнем представления (PL), бизнес-логикой (BLL) и уровнем доступа к данным (DAL).
Обычная трехуровневая логика архитектуры утверждает, что BLL должен выступать в качестве посредника между PL и DAL. PL не должен даже знать, что есть база данных, в то время как DAL не должен знать, что есть BLL или PL.
Традиционная архитектура с 3 уровнями и 3 уровня с IOC

Реализация выше создаст следующие зависимости между 3 различных физических проектов следующим образом

  • PL       Project -> Отнесение BLL DLL
  • BLL   Project -> Отнесение DAL DLL
  • DAL   Проект -> No Reference


Однако применение концепции МОК между BLL и DAL путем определения интерфейсов в BLL для ДАЛ для реализации и использования DI с помощью инъекции конструктора изменит зависимость следующим

  • PL       Project -> Отнесение BLL DLL, ведение DAL DLL (для DI конкретных типов к конструкторам объектов БЛЛ)
  • БЛЛА   PROJE кт -> Нет Ссылка
  • DAL   Project -> Отнесение BLL DLL (для реализации BLL интерфейсов)

Так являются МОК и традиционный 3 яруса в конфликте?

В идеале я хочу добиться следующего, сохраняя при этом мой МОК с помощью DI.

  • PL       Project -> Отнесение BLL DLL
  • BLL   Project -> Нет Ссылка
  • DAL   Project -> Отнесение BLL DLL

Как вы это делаете?

+0

Старый вопрос, но я думаю, что этот другой ответ может помочь: http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies- в-начальное приложение. В принципе, вы не хотите, чтобы ваш BLL ссылался на DAL, а скорее вводил его с помощью контейнера IoC. Следовательно, ваш корневой состав (точка входа в приложение, возможно, в проекте PL) будет ссылаться на все ваши DLL, или вы используете позднюю привязку. –

ответ

2

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

Я также не уверен, зачем вам нужна связь от DAL до BLL? Это для звонков? Вы не можете использовать события вместо этого?

Предполагая, что все 3 уровня запущены и предполагается, что ваш PL является «точкой входа» в ваше приложение (Root Composition), IMO - обычная зависимость, если вы отделили интерфейсы, с кодом начальной загрузки в PL, это:

  • PL => Ссылка на BLL и DAL (бетон и интерфейсы), и контейнер IoC
  • БЛЛОВ Ссылки DAL (или только интерфейс, если это применимо)
  • ДАЛО нет зависимостей (хотя обычно будет зависеть от DTO/POCO/организаций)

ЛП может разгрузить конфигурацию IoC к DLL Bootstrapper, в результате чего:

  • PL => Ссылки на BLL интерфейс и Загрузчик
  • Загрузчик => Ссылки все и контейнер IoC
  • БЛЛ = > Ссылки DAL Интерфейс
  • DAL => нет зависимостей (хотя, как правило, будет иметь зависимость от DTO/POCO/Entities)

В некоторых контейнерах вы можете избежать необходимости ссылаться на все dll из загрузочного устройства на using configuration, or convention. Однако эти DLL, очевидно, все еще необходимо развернуть с вашим приложением.

+1

@@ nonnb, вы указываете DAL без зависимости от обоих параметров. Но я сделал IOC, где я определил интерфейсы IRepository в своем BLL. Любой DAL, который должен работать с BLL, должен реализовать эти интерфейсы. Логика заключается в том, что любая БД и, следовательно, DAL - это только хранилище для объектов BLL, и поэтому DAL должен зависеть от BLL, а не наоборот. – devanalyst

+0

Оглядываясь назад, OP, возможно, ссылалась на модель домена стиля Эванса как BLL, следовательно, требование ссылаться на домен из DAL. Другой вариант - использовать отдельную «анемичную» DTO PO [CJ] Os для де-гидратации в DAL. Затем они могут быть отображены в/из модели BLL/Domain. Инструмент, такой как Automapper, облегчил бы кодирование. Тогда как DAL, так и BLL будут иметь ссылки на DTO – StuartLC