Проблема, с которой вы столкнулись, связана с тем, что вы используете DI-контейнер.Такая проблема с меньшей вероятностью возникает при использовании Pure DI , поскольку в этом случае компилятор C # будет проверять конструкцию объекта, и такую циклическую зависимость практически невозможно получить.
Когдавы используете DI-контейнер, убедитесь, что вы используете DI-контейнер, который позволяет обнаруживать циклические зависимости и сообщает о существенной ошибке.На самом деле, любой из зрелых DI-контейнеров действительно очень четко сообщает об ошибках циклической зависимости .Если выбранный вами DI-контейнер генерирует исключение переполнения стека, рассмотрите возможность переключения на устаревший контейнер.
Простой инжектор , например, сгенерирует исключение со следующим сообщением:
Недопустимая конфигурация.Не удалось создать экземпляр для типа IGroupService.Тип GroupService прямо или косвенно зависит от самого себя.Циклический граф содержит следующие типы: GroupService -> UserService -> GroupService.
Другими словами, Simple Injector показывает циклический граф следующим образом:
GroupService ->UserService -> GroupService
Таким образом, вам не нужно визуализировать граф объектов, и фактически большинство контейнеров не смогут это сделать из-за циклической зависимости.Если ваш объектный граф был ациклическим, Simple Injector будет визуализировать график следующим образом при детализации контейнера с помощью отладчика Visual Studio:
ИлиВы можете достичь того же, используя программный API Simple Injector:
var graph = container.GetRegistration(typeof(UserService)).VisualizeObjectGraph();
В результате вы получите следующий текст:
UserService(
GroupService(
RoleService(
LoggingService()),
LoggingService()),
LoggingService())
Обратите внимание, что пробег может отличаться от других контейнеров DI, ноОпять же, большинство более зрелых библиотек содержат эти типы функций.