2016-02-16 3 views
0

Я работал над очень большой программой, которая содержит более 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 есть обнаружение этой проблемы, и я еще не нашел ее. Мой вопрос в том, где код, который решает эту проблему? Мне трудно поверить, что я единственный человек, у которого была эта проблема.

ответ

0

См. this question и его ответы. Поскольку вы используете инъекцию свойств, циклы отлично подходят, потому что они просто устанавливаются после создания всех объектов. Если вы использовали инсталляцию конструктора (которую вы определенно должны использовать), то вы получите исключение во время выполнения в любое время, когда цикл будет обнаружен, и он будет содержать все детали, необходимые для его исправления.

+0

Спасибо за ссылку, она пролила свет на то, как другие люди решают эту проблему. В этой связи Марк Семанн заявил, что циркулярные ссылки обычно являются признаком дефекта дизайна, и я склонен согласиться с тем, что он может привести к бесконечным циклам, если они не будут правильно управляться. Я также хотел бы избежать ошибок во время выполнения, поскольку эта проблема может быть обнаружена в модульном тесте. Но еще раз спасибо за совет. –

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