Инжекция Dependecy: как преодолеть циклические зависимости

Спасибо за чтение.

Я использую платформу Единицы для реализации внедрения зависимости в моем приложении (ASP.NET MVC). Иногда существуют некоторые циклические зависимости среди сервисов, которых я хочу избежать.

Таким образом, я ищу решения:)


Мой случай

хорошо позволяет, воображают 3 сервиса ServiceSally, ServiceJoe, ServiceJudy

ServiceSally зависит от ServiceJoe

ServiceJoe зависит от ServiceJudy

ServiceJudy зависит от ServiceSally (<<, Который является довольно странным не так ли?)

Таким образом, если Вы инстанцируете ServiceSally, то ей будет нужен ServiceJoe, который будет введен, и ServiceJoe будет нужен ServiceJudy и.... СТУЧИТЕ!... ServiceJudy будет нужен ServiceSally, начинающий бесконечный цикл - и очень печальный любовный треугольник-.


Как я мог решить этот циклический-loveTriangle случай?: /

ОБНОВЛЕНИЕ:

Мое первое решение: LazyJoe

Что относительно использовать обертку вокруг сервисных ссылок для задержки инжекции, пока они не используются?

Что Вы думаете?

5
задан Bill the Lizard 8 February 2014 в 15:17
поделиться

3 ответа

Это зависит от того, какую (если есть) структуру DI вы используете. Spring , например, будет обрабатывать этот вид циклической зависимости до тех пор, пока не каждый задействованный компонент (объект) инициализируется конструктором. По сути, он вставляет пустой объект (по крайней мере) в один из других bean-компонентов и инициализирует его позже. Таким образом, последовательность выглядит примерно так:

  1. Создать ServiceSally
  2. Создать ServiceJoe
  3. Создать ServiceJudy
  4. Инициализировать ServiceJudy
  5. Ввести ServiceJudy в ServiceJoe
  6. Инициализировать ServiceJoe
  7. Ввести ServiceJoe в ServiceSally
  8. Инициализация ServiceSally
  9. Внедрение ServiceSally в ServiceJudy
  10. Сообщите ServiceJoe, ServiceJudy и ServiceSally, что они готовы

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

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

7
ответ дан 14 December 2019 в 08:49
поделиться

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

Если вы выполняете «ленивый DI», почему вы вообще делаете DI? Одно из преимуществ использования DI - это не беспокоиться о том, что ваши зависимости инициализируются, вы просто имеете их там, когда они вам нужны.

-2
ответ дан 14 December 2019 в 08:49
поделиться

Не делайте Службу * зависимой от другой конкретной Службы *. Сделайте их зависимыми от суперкласса или интерфейса. Затем после создания вставьте конкретную службу * в другую службу *.

2
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: