2008-09-25 11 views
29

Kürzlich bemerkte ich, dass meine Anwendung scheint, Speicher zu essen, der nie veröffentlicht wird. Nach dem Profiling mit CLRProfiler habe ich festgestellt, dass der Castle Windsor Container, den ich verwende, Objekte festhält. Diese Objekte werden mit dem Attribut lifestyle = "transient" in der Konfigurationsdatei xml deklariert.Warum hält Castle Windsor transiente Objekte fest?

Ich habe festgestellt, wenn ich einen expliziten Aufruf an IWindsorContainer.Release(hangingObject), dass es seine Referenzen fallen lassen.

Dies verursacht jedoch ein Problem, ich habe nicht erwartet, dass mit einem vorübergehenden Lifestyle-Objekt CastleWindsor eine Referenz behalten und effektiv ein Leck erstellen würde. Es wird eine eher banale und fehleranfällige Aufgabe sein, explizite Freigabeanrufe an allen geeigneten Stellen einzufügen.

Haben Sie dieses Problem gesehen, und haben Sie Vorschläge, wie Sie es umgehen können?

Antwort

20

Ich denke, dass die Antworten hier einen wichtigen Punkt fehlt - dass dieses Verhalten über Release-Richtlinien out-of-the-box konfigurierbar ist - sehen Sie sich die Dokumentation auf der Burg Projektseite here. In vielen Szenarien, insbesondere wenn Ihr Container für die gesamte Lebensdauer der Hosting-Anwendung existiert und transiente Komponenten wirklich nicht nachverfolgt werden müssen (weil Sie die Entsorgung in Ihrem Anrufcode oder in der Komponente verwalten, die mit der Service), dann können Sie einfach die Freigaberichtlinie auf die NoTrackingReleasePolicy Implementierung setzen und damit fertig sein.

Vor Castle v 1.0 I Komponente Burden glauben wird umgesetzt/eingeführt - was einige dieser Probleme zu lindern helfen auch um Entsorgung von injizierten Abhängigkeiten usw.

Edit:

Check out die folgenden Beiträge für mehr Diskussion der Komponentenbelastung.

The Component Burden - Davy Brions

Auch Komponente Belastung wird in der official 2.0 release des Windsor Container umgesetzt.

1

Sie können jedoch einen Lebensstil von Singleton oder Transient für Objekte im Container festlegen. Singleton-Objekte, die ich verstehe, sollten das Leben der Anwendung dauern, aber ich verstehe nicht die Nützlichkeit dieses Behaviours, der für vorübergehende gleich ist!

Benutzerdefinierte Lebensstile können erstellt werden, indem ILifestyleManager implementiert wird. Vielleicht ist es möglich, dies geeignet zu implementieren, um einen Lifestyle-Typ ReallyTransient zu erstellen!

2

Eine Sache zu beachten ist, dass dies im Castle Trunk behoben wurde. In r5475 hat Hammett die Standard-Freigaberichtlinie in MicroKernel in LifecycledComponentsReleasePolicy geändert.

Verwandte Themen