2017-02-05 2 views
2

У меня есть решение:циклической зависимости и единство Контейнер

solution

  • Business иметь ссылку на Business.Interfaces, DataAccess.Interfaces и Factory (для решимости IDataAccess в DataAccess.Interfaces)
  • MainProject есть ссылка на Business.Interfaces и Factory (для решения IBusiness в Business.Interfaces)

Мой проект на заводе использует Unity для зависимостей разрешения. Этот проект должен иметь ссылку на все остальные проекты, кроме MainProject, для доступа к конструкторам конкретного класса и отображения между классом и интерфейсами.

Но я не добавить ссылку на Business в Factory проекте, потому что Visual Studio говорит мне:

Ссылка на бизнес не может быть добавлен. Добавление этого проекта в качестве ссылки приведет к циклической зависимости

Как это решить?

+0

Я не очень хорошо знаком с Unity, но думаю, что у вас должны быть конфигурации (регистрация классов) в соответствующем проекте, причем не все в одном проекте. – KernelMode

ответ

1

Как @Andrei указывал, при настройке приложения использовать DI, то приложение должны нести ответственность за разводку всех его зависимостей в Composition Root.

Корень композиции (предпочтительно) уникальное место в приложении, где модули составлены вместе.

Кроме того, композиция должна корневой не быть перемещены на внешнюю библиотеку. Подумайте о корне композиции как современном код Замена для файла .config. Это приложение, которое отвечает за его загрузку и предоставление ее содержимого зависимым сборкам - то же самое верно для корня композиции.

Это задание Корневой композиции для . Нажимаем зависимости в остальной части приложения. Зависимые сборки не должны пытаться выполнить свои собственные зависимости. Это называется принцип Голливуда - «Не звоните нам, мы вам позвоним». Тем не менее, также часто используется abstract factory pattern в сочетании с DI.

См. this answer за хорошее визуальное представление о том, как оно должно работать. Ваше приложение выглядит лот, как и первое изображение - вы должны стремиться сделать его похожим на второй. Приложение логически установка в отдельных слоях, которые зависят друг от друга, но это физически очень плоский.

+0

Спасибо за ваш полный ответ. Теперь я использую файл конфигурации в своем основном проекте для описания сопоставления между конкретным классом и интерфейсами. И это мой основной проект, который имеет все ссылки на другие проекты. Проект «Завод» читает единицу в конфигурации и разрешает зависимость с помощью «Единства». –

+0

О, нет, это не то, что я имел в виду. Не * фактически * поместите свою конфигурацию в файл '.config'. Это устаревший способ сделать DI (на самом деле, многие контейнеры отказались от поддержки). Конфигурация XML не является безопасным по типу и очень хрупка по сравнению с настройкой контейнера в коде. Но обработайте этот код так, как если бы он * был * .config' для приложения. – NightOwl888

+0

Хм нормально, как это сделать на самом деле? В моем основном проекте есть файл unityconfiguration.xml с отображением между классом и интерфейсами. В моем основном проекте также есть ссылки на другие проекты. Как это изменить? Мой заводский проект не имеет ссылки на другие проекты, и я не хочу добавлять ссылку в этот проект. Этот проект проверяет конфигурацию и разрешает только зависимости. –

2

Одним из способов было бы немного реорганизовать ваш проект.

Я полностью избавился от проекта Factory. Если все, что вы делаете, это разрешить зависимости, вы можете сделать это в своем MainProject, так как это единственное, что нужно будет знать, как сопоставлять вещи. Business не должны заботиться о каких-либо конкретных реализациях, предполагая, что все, что он делает, - это реализовать свою бизнес-логику. Пусть он работает только с абстракциями, а не с конкретными классами.

Итак, у Business есть зависимости только от проектов Interfaces, Factory ушло, и все сопоставление Единства сделано в MainProject. MainProject - единственный, который ссылается на все другие проекты.

+0

Спасибо за ваш ответ, я проверю это! –

Смежные вопросы