2017-07-03 5 views
0

Ich verwende einen Autofac-Container für die gesamte Lebensdauer meiner Anwendung, aber ich möchte die Komponenten selbst entsorgen.Autofac- extern besessener Behälter?

IE, wenn ich builder.RegisterType<SomeType>() habe, ich will nicht die Container Referenzen von SomeType zu halten, die auch diejenigen am Leben halten, wenn sie nicht irgendwo anders verwiesen (wenn RegisterInstance verwendet wird OTOH, dann natürlich die Behälter müssen einen Verweis halten der Singleton).

Ich kann sehen, dass ich builder.RegisterType<SomeType>().ExternallyOwned() tun kann, die mein Problem für einen Typ löst, aber ich will es nicht für jeden Typ schreiben, und noch wichtiger benutze ich auch builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());, die mir die Option der Verwendung nicht gibt ExternallyOwned.

Gibt es eine Möglichkeit, "ExternallyOwned" für den gesamten Container anzugeben? Oder anders gesagt, weisen Sie den Container an, die gesamte Verfügungsfunktion zu deaktivieren und Referenzen für Objekte, die er nicht benötigt, nicht zu behalten?

+0

Ich würde Erweiterungs-Methoden auf dem ContainerBuilder in Betracht ziehen, so dass Sie builder.RegisterExternalType () schreiben und bekommen können, was Sie wollten, ohne explizit zwei Methoden überall aufzurufen. – Mithon

+0

Das ist nicht gut genug, denn wie gesagt, ich benutze auch 'builder.RegisterSource (new AnyConcreteTypeNotAlreadyRegisteredSource());' – tzachs

+0

Ah. Aha. Ich habe diesen Teil vermisst. Dann ist es wohl auch deine eigene Registrierungsquelle, denke ich. Und ehrlich gesagt, wenn man sich anschaut, wie schlank diese Quelle ist, ist das nicht wirklich ein großer Job. :) – Mithon

Antwort

1

Es gibt keine Möglichkeit, Container-Entsorgungsdienste zu deaktivieren. Sie könnten versuchen, mit something like the logging module in Verbindung zu treten, aber ich konnte sehen, dass nicht funktioniert 100% und fehlende Rand Fälle von Ihnen nicht vorsichtig sind.

Automatische Verfolgung und Entsorgung ist eine ziemlich häufige Containerfunktion. Ich würde empfehlen, anstatt es zu bekämpfen, deinen Code umzuformen, um ihn zu umarmen. Es wird das Leben viel einfacher machen.

+0

Danke für die Antwort. Ich kann nicht wirklich sehen, wie ich meinen Code umgestalten kann, um automatische Beseitigung zu umfassen. Ich meine, es ist ein wirklich praktisches Feature, wenn Sie Workflows für Arbeitseinheiten ausführen, bei denen Sie nach Abschluss Ihrer Arbeit den Container und alles damit entsorgen. Aber in meinem Fall schreibe ich eine Spielengine und benutze den Container, um alles anpassen zu können. Es gibt keine Arbeitseinheit, der Spieleentwickler kann während des gesamten Spiels einen Feind erzeugen oder einen Textur-/Sound-Effekt laden, so dass das Leben des Containers und seiner erstellten Objekte überhaupt nicht gebunden ist. – tzachs

+0

Wenn dies die Antwort ist (ob es das Problem löst oder nicht, es ist die tatsächliche Antwort auf die Frage), akzeptieren Sie es bitte, damit ich Kredit bekommen kann. –

+0

Ich hoffe immer noch, dass es jemandem gelingt, eine magische Lösung zu finden. Wenn es in ein paar Tagen keine Antwort gibt, akzeptiere ich deine Antwort. – tzachs