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:
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 ..."
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.
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.
Weitere Informationen finden Sie hier: Ссылка
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 ...
Tags und Links c# dependency-injection circular-dependency structuremap