Dienste sollten in umgekehrter Reihenfolge verworfen werden, in der sie erstellt wurden.
Wenn Service A von Service B abhängt, wird zuerst B erstellt, dann A. Wenn jetzt Dispose()
von A aufgerufen wird, muss es möglicherweise B verwenden. Leider ist B möglicherweise bereits verworfen, da die Reihenfolge nicht deterministisch ist und basierend auf einem Wörterbucheintrag. Ich schlage vor, dass wir erzwingen, dass die Entsorgungsreihenfolge sowohl logisch als auch deterministisch ist, sofern die Abhängigkeitsreihenfolge definiert ist.
Ich habe einen Branch , der dies in unserem Container implementiert und Spezifikationstests hinzufügt, aber ich habe einige Bedenken:
IServiceProvider
IDisposable
in der Spezifikation sein muss, aber das Hinzufügen dieser Tests erzwingt dies. Weder die Autofac- noch die StructureMap-Implementierung von IServiceProvider
ist IDisposable
@khellang @nblumhardt was
Danke für das Einschleifen! Dies klingt wie ein weiterer Fall, in dem Annahmen im Framework zu Problemen bei einigen Containerintegrationen führen können.
Die Entsorgung in umgekehrter Reihenfolge ist notwendig, um einige Komponentengraphen korrekt zu löschen, zB wenn A : IDisposable
sich bei der Erstellung mit B : IDisposable
"registriert" und bei der Entsorgung "unregistriert", aber:
Wenn Benutzer eine Forward-Order-Entsorgung wünschen, sollten sie sich darauf verlassen können, indem sie einen Container auswählen, der sie implementiert - und umgekehrt. Persönlich denke ich, dass die umgekehrte Reihenfolge der _richtige_ Weg ist, aber es ist sehr unwahrscheinlich, dass mir alle zustimmen ;-)
Behoben durch https://github.com/aspnet/DependencyInjection/pull/505
Hilfreichster Kommentar
Danke für das Einschleifen! Dies klingt wie ein weiterer Fall, in dem Annahmen im Framework zu Problemen bei einigen Containerintegrationen führen können.
Die Entsorgung in umgekehrter Reihenfolge ist notwendig, um einige Komponentengraphen korrekt zu löschen, zB wenn
A : IDisposable
sich bei der Erstellung mitB : IDisposable
"registriert" und bei der Entsorgung "unregistriert", aber:Wenn Benutzer eine Forward-Order-Entsorgung wünschen, sollten sie sich darauf verlassen können, indem sie einen Container auswählen, der sie implementiert - und umgekehrt. Persönlich denke ich, dass die umgekehrte Reihenfolge der _richtige_ Weg ist, aber es ist sehr unwahrscheinlich, dass mir alle zustimmen ;-)
433 ist eine Diskussion in diese Richtung - die Entsorgungsreihenfolge wäre ein guter Punkt, um die Zusammenfassung auf diesem Ticket hinzuzufügen, denke ich.