Autofac, IoC и разделение слоев

В моем проекте ASP.NET MVC 4 С# у меня есть 3 слоя. Данные, бизнес и Интернет. Я следую шаблону и услугам репозитория.

Я использую Autofac для внедрения зависимостей. Что я сделал, так это зарегистрировал компоненты в global.asax. Таким образом, мне пришлось ссылаться на мой уровень данных, где я реализовал репозитории.

Я думаю, что это нарушает правило, потому что в моем веб-проекте есть ссылка на уровень данных.

Я прочитал несколько статей о решении этой проблемы и нашел модули Autofac. Однако я не смог найти способ реализовать его без ссылки на уровень данных.

Есть ли способ зарегистрировать компоненты без ссылки на уровень данных?

Спасибо.


person SherleyDev    schedule 10.11.2013    source источник
comment
Где определены интерфейсы, которые реализует уровень данных?   -  person Keith Payne    schedule 10.11.2013
comment
Уровень данных состоит из универсального репозитория и классов единиц работы, а также классов репозитория, полученных из универсального репозитория. На самом деле у меня есть 4 проекта, 3 из них упомянуты в вопросе, а 4-й - доменный проект, в котором я реализую сущности (сначала код). Сервисы находятся на бизнес-уровне.   -  person SherleyDev    schedule 10.11.2013
comment
Связано: stackoverflow.com/a/9503612/126014   -  person Mark Seemann    schedule 10.11.2013
comment
Спасибо, Марк. Я прочитал этот пост и вашу основную статью о композиции. Теперь я запутался в использовании модулей Autofac. Если можно зарегистрировать компоненты на моем уровне представления (приложение MVC — global.asax), добавив ссылки на проект, то зачем мне использовать модули? Большое Вам спасибо.   -  person SherleyDev    schedule 10.11.2013
comment
@SherleyDev: ты неправильно понял. Корень композиции не находится на слое презентации. Корень композиции — это другой слой (собственный слой), хотя физически вы можете поместить его в ту же сборку, что и уровень представления.   -  person Steven    schedule 10.11.2013
comment
Зачем вам модули? Это хороший вопрос. Я бы сказал, что вам вряд ли когда-нибудь понадобится такая функция.   -  person Steven    schedule 10.11.2013
comment
@Steven: Итак, что мне нужно сделать, так это создать отдельный проект библиотеки для корня композиции, который ссылается на все необходимые проекты (например, домен, бизнес и т. д.), а затем ссылаться на этот проект в приложении mvc, верно?   -  person SherleyDev    schedule 10.11.2013
comment
@SherleyDev: Нет! Точно нет. Слой != сборка. Сборка — это артефакт развертывания. Слой — это логический артефакт. Извлечение корня композиции в его собственную сборку только усложнит задачу и не даст никаких преимуществ. Также прочитайте мой ответ на вопрос, на который указал Марк.   -  person Steven    schedule 10.11.2013
comment
@Стивен: я в полном замешательстве. Итак, чтобы следовать упомянутой вами практике, что мне делать? Должен ли я использовать файл начальной загрузки и вызывать его из global.asax? У вас есть статья/блог, посвященная этой ситуации?   -  person SherleyDev    schedule 10.11.2013
comment
давайте продолжим это обсуждение в чате   -  person Steven    schedule 10.11.2013


Ответы (1)


На мой взгляд, ситуация у вас именно то, что вы ищете.

Вам не нужна такая ссылочная структура: LibA => LibB => LibC => ...

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

Можно ссылаться на уровень данных из слоя представления (если это корень вашей композиции).

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

person Kenneth    schedule 10.11.2013