Спасибо за чтение.
Я использую платформу Единицы для реализации внедрения зависимости в моем приложении (ASP.NET MVC). Иногда существуют некоторые циклические зависимости среди сервисов, которых я хочу избежать.
Таким образом, я ищу решения:)
хорошо позволяет, воображают 3 сервиса ServiceSally, ServiceJoe, ServiceJudy
ServiceSally зависит от ServiceJoe
ServiceJoe зависит от ServiceJudy
ServiceJudy зависит от ServiceSally (<<, Который является довольно странным не так ли?)
Таким образом, если Вы инстанцируете ServiceSally, то ей будет нужен ServiceJoe, который будет введен, и ServiceJoe будет нужен ServiceJudy и.... СТУЧИТЕ!... ServiceJudy будет нужен ServiceSally, начинающий бесконечный цикл - и очень печальный любовный треугольник-.
Как я мог решить этот циклический-loveTriangle случай?: /
ОБНОВЛЕНИЕ:
Мое первое решение: LazyJoe
Что относительно использовать обертку вокруг сервисных ссылок для задержки инжекции, пока они не используются?
Что Вы думаете?
Это зависит от того, какую (если есть) структуру DI вы используете. Spring , например, будет обрабатывать этот вид циклической зависимости до тех пор, пока не каждый задействованный компонент (объект) инициализируется конструктором. По сути, он вставляет пустой объект (по крайней мере) в один из других bean-компонентов и инициализирует его позже. Таким образом, последовательность выглядит примерно так:
Вот почему инициализация при построении не будет работать с этим методом (поскольку инициализация откладывается). Это действительно единственный способ справиться с этим. Что ж, может быть, вы могли бы также использовать какой-нибудь прокси (временный или постоянный).
Вообще говоря, по крайней мере, по моему опыту, циклические зависимости являются симптомом конструкции, которая либо некорректна, либо нуждается в упрощении.
Я в некоторой степени согласен с Клетусом, когда вы обнаруживаете, что услуги зависят друг от друга, пора сесть и пересмотреть свой дизайн.
Если вы выполняете «ленивый DI», почему вы вообще делаете DI? Одно из преимуществ использования DI - это не беспокоиться о том, что ваши зависимости инициализируются, вы просто имеете их там, когда они вам нужны.
Не делайте Службу * зависимой от другой конкретной Службы *. Сделайте их зависимыми от суперкласса или интерфейса. Затем после создания вставьте конкретную службу * в другую службу *.