Ich benutze eine Castle Windsor typisierte Fabrik. In unserem Registrierungscode wird es so einrichten, kann es eine transiente Komponente erstellen:Castle Windsor typisierte Fabrik ohne Freigabe leckt nicht
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IThingFactory>().AsFactory());
container.Register(Component.For<IThing>().ImplementedBy<TransientObject>().Named("TransientObject").LifeStyle.Transient);
Von meinem Verständnis von the Castle Windsor Typed Factory documentation dachte ich, dass ein Transient Objekt muss von einem typisierten Fabrik Verfahren gelöst werden, da sonst die typisierten Fabrik würde Behalte einen Verweis auf das Objekt. Ich habe versucht, dies zu beweisen, indem ich einen Test schreibe, der die in this StackOverflow article erläuterte Methode verwendet.
Aber zu meiner Überraschung scheitert es eigentlich nicht, was bedeutet, dass, obwohl ich das transiente Objekt nicht zur Fabrik freigegeben habe, es immer noch vom GC zurückgewonnen werden kann. Ich bin besorgt, dass mein Test vielleicht irreführend ist und es wirklich ein Leck gibt.
Also meine Frage ist: ist mein Test falsch, oder ist die Dokumentation falsch?
Hier ist der Test:
var factory = container.Resolve<IThingFactory>();
WeakReference reference = null;
new Action(() =>
{
var service = factory.GetTransientObject();
reference = new WeakReference(service, true);
})();
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.That(reference.Target, Is.Null, "reference should be null");
was ist die Frage? –
Erweitert/implementiert Ihre "IThing" IDisposable Schnittstelle? Es steht geschrieben, dass "Windsor immer Einweg-Nicht-Singleton-Komponenten verfolgt, die über eine typisierte Fabrik aufgelöst werden." – piotrwest
Ich glaube, piotrwest hat meine Frage beantwortet: Nein, mein IThing implementiert IDisposable nicht. Ich hatte die Implikationen von "Windsor immer Tracks _ disposable _..." vermisst. Vielen Dank! – MrBlueSky