Circular Abhängigkeiten in StructureMap - können sie mit Property-Injektion gebrochen werden?

9

Ich habe die einfachste Art von zirkularer Abhängigkeit in der Strukturkarte - Klasse A stützt sich in ihrem Konstruktor auf Klasse B und Klasse B in ihrem Konstruktor auf Klasse A. Um die Abhängigkeit zu trennen, habe ich Klasse B dazu gebracht, Klasse A als Eigenschaft und nicht als Konstruktorargument zu verwenden, aber Strukturkarte klagt immer noch.

Ich habe gesehen, dass zirkuläre Abhängigkeiten mit dieser Methode in anderen DI-Frameworks unterbrochen wurden - ist das ein Problem mit der Strukturkarte oder mache ich etwas falsch?

Bearbeiten: Ich sollte erwähnen, dass die Eigenschaft von Klasse B ein Array von Instanzen der Klasse A ist, die wie folgt verdrahtet sind:

%Vor%

Nur um zu verdeutlichen, möchte ich die folgende Sequenz von Ereignissen auftreten:

  • Konstruiere eine Instanz von B, "b"
  • Konstruiere eine Instanz von A, "a", injiziere "b" in seinen Konstruktor
  • Setzen Sie "b.ArrayOfA" auf ["a"]

Und ich möchte, dass all das mit Autowiring geschieht, wenn möglich ...

Edit 2: Hier ist ein vereinfachtes Beispiel, das explizite Verkabelung verwendet:

%Vor%

Das Überprüfen der Konfiguration führt dazu, dass "Bidirectional Dependency Problem mit RequestedType erkannt wird: IocTest2.ILoader ..."

    
Andy 06.05.2010, 15:30
quelle

3 Antworten

3

Der nächste, den Sie bekommen können, ist etwa so:

%Vor%

Wenn A andere Abhängigkeiten hat, die Sie aus dem Container auflösen möchten, können Sie sie von ctx innerhalb des OnCreation-Lambdas abrufen.

    
Joshua Flanagan 06.05.2010, 18:32
quelle
5

StructureMap kann bidirektionale Situationen auch mit einer Problemumgehung mit Lazy-Auflösung umgehen.

Wenn Sie eine einfache Situation wie ClassA haben, die von ClassB und ClassB abhängt, die von ClassA abhängen, können Sie eine davon auswählen und die Abhängigkeit als Lazy-Abhängigkeit konvertieren. Dieser Weg hat für mich funktioniert und dieser Fehler ist nie wieder aufgetreten.

%Vor%

Weitere Informationen finden Sie hier: Ссылка

    
Javier 29.10.2016 20:02
quelle
0

StructureMap führt wahrscheinlich Setter-Injektion aus, wo es öffentlich einstellbare Eigenschaften für ein Objekt, das aufgelöst wird, auffüllt. Laut der Dokumentation

  

Standardmäßig sind alle öffentlichen "Setter" optional, was bedeutet, dass diese Setter nur gesetzt werden, wenn sie explizit für eine bestimmte Instanz konfiguriert sind

Haben Sie also zufällig die Eigenschaften so eingerichtet, dass sie automatisch verkabelt werden? Wenn dies der Fall ist, haben Sie immer noch das Problem der zirkulären Abhängigkeit.

Edit: Ich sehe, dass Sie haben. In Ihrer Instanz, weil B A [] injiziert hat, muss StructureMap die Abhängigkeit jedes A für ein B auflösen, das A [] benötigt, und so weiter ...

    
statenjason 06.05.2010 15:43
quelle