Я работал над очень большой программой, которая содержит более 100 элементов в контейнере IOC (мы используем Castle Windsor для контейнера). Я ошибочно создал цикл на графике для контейнера. Я исправил проблему, и теперь я пытаюсь создать единичный тест, чтобы эта проблема была обнаружена в будущем. Я решил использовать глубину первого поиска по графику, чтобы найти циклы. Упрощенная программа ниже создает ту же проблему:Обнаружение цикла цикла IOC с помощью Windsor
public class Class1
{
public Class3 Object3
{
get;
set;
}
}
public class Class2
{
public Class1 Object1
{
get;
set;
}
}
public class Class3
{
public Class2 Object2
{
get;
set;
}
}
public static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(
Component.For<Class1>().ImplementedBy<Class1>(),
Component.For<Class2>().ImplementedBy<Class2>(),
Component.For<Class3>().ImplementedBy<Class3>());
var object1 = container.Resolve<Class1>();
Debug.Assert(object1.Object3 != null);
Debug.Assert(object1.Object3.Object2 != null);
Debug.Assert(object1.Object3.Object2.Object1 != null);//fail
}
Я понял, что это обычная проблема. Однако после нескольких часов исследований я не нашел этого Виндзора или кого-либо еще, у кого была эта проблема или какой-либо код, который бы выявил эту проблему. Я сильно подозреваю, что кто-то уже создал решение этой проблемы, специфичное для Windsor в библиотеке, или у Windsor есть обнаружение этой проблемы, и я еще не нашел ее. Мой вопрос в том, где код, который решает эту проблему? Мне трудно поверить, что я единственный человек, у которого была эта проблема.
Спасибо за ссылку, она пролила свет на то, как другие люди решают эту проблему. В этой связи Марк Семанн заявил, что циркулярные ссылки обычно являются признаком дефекта дизайна, и я склонен согласиться с тем, что он может привести к бесконечным циклам, если они не будут правильно управляться. Я также хотел бы избежать ошибок во время выполнения, поскольку эта проблема может быть обнаружена в модульном тесте. Но еще раз спасибо за совет. –