Ein guter Artikel, um über den Kontrollumfang und Lebenszyklus von Autofac zu lernen: Der Lebenszyklusumfang entspricht einer Arbeitseinheit in Ihrer Anwendung, eine Arbeitseinheit beginnt den Lebenszyklusumfang von vorne, und dann werden die Dienste, die diese Arbeitseinheit benötigen, vom Lebenszyklusumfang getrennt.
Lebenszeit-Zielfernrohre
Erstelle Lifetme-Teleskope
Erstelle manuell ein Zielfernrohr und entsorge es. Lebenszeit-Teleskope sind Einweg-Teleskope und verfolgen die Entsorgung von Komponenten, also rufe immer "Entsorgung()" auf oder verpacke sie in "nutzung"-Anweisungen.
Label Lifetime Scopes
Manchmal müssen Sie einige Dienste innerhalb einer Arbeitseinheit teilen, aber Sie möchten keine globalen Freigabe-Bequemlichkeiten wie den Singleton-Modus nutzen. Zum Beispiel den Lebenszyklus pro Anfrage einer Webanwendung, in diesem Fall können Sie InstancePerMatchingLifetimeScope verwenden, um Ihren Lebenszyklus und Ihren Service zu identifizieren.
Zum Beispiel gibt es eine Komponente, die E-Mails sendet, und die Transaktionslogik muss Nachrichten mehrfach senden, sodass der Mail-Dienst in jedem logischen Transaktionsabschnitt geteilt werden kann. Wenn du nicht möchtest, dass die E-Mail-Komponente ein globaler Singleton ist, kannst du sie wie folgt festlegen.
Aufnahmen von Registrierungen zu einem lebenslangen Umfang hinzufügen
Autofac erlaubt es, beim Erstellen eines Lebenszyklus "on the fly" hinzuzufügen. Das kann dir helfen, wenn du eine Art "Punktschweiß"-Übersteuerung mit begrenzter Registrierung machen musst oder wenn du generell zusätzliche Dinge in einem Teleskop brauchst, die du nicht global registrieren möchtest. Das machst du, indem du eine Lambda an BeginLifetimeScope() übergibst, die einen ContainerBuilder nimmt und Registrierungen hinzufügt. (Registrieren Sie beim Erstellen eines Lebenszyklus zusätzliche Dienste ohne globale Registrierung.)
Instanzumfang
Der Instanzumfang bestimmt, wie eine Instanz zwischen Anfragen geteilt wird. Beim Anfordern eines Dienstes kann Autofac einen einzelnen Instanz-Scope, eine neue Instanz pro Abhängigkeits-Scope oder einen Singleton in einem Kontext zurückgeben, wie etwa einen Thread oder eine HTTP-Anfrage pro Lifetime-Scope. Dies gilt sowohl für Instanzen, die von einem expliziten Resolve()-Aufruf zurückgegeben werden, als auch für Instanzen, die intern vom Container erstellt werden, um die Abhängigkeiten einer anderen Komponente zu erfüllen.
- Instanz pro Abhängigkeit
- Einzelne Instanz
- Instanz-pro-Lebenszeit-Umfang
- Instance-per-Matching-Lebensdauer
- Instanz pro Anfrage
- Instanz pro Besitz
- Fadenumfang
Instanz pro Abhängigkeit
In anderen Containern auch Transient' oder 'Factory' genannt, gibt es bei jeder Anfrage eines Dienstes eine eindeutige Instanz zurück. Wenn kein Lebenszyklus angegeben ist, ist dies das Standardverhalten.
Jede Resolve-Abhängigkeit gibt eine neue Komponente zurück.
Einzelne Instanz
Die gleiche Instanz wird für alle Anfragen und verschachtelten Scopes zurückgegeben.
Instanz-pro-Lebenszeit-Umfang
Dieser Scope kann auf verschachtelte Scopes angewendet werden. Die per-Lifetime-Scope-Komponente hat maximal eine Instanz innerhalb des verschachtelten Scopes. Dies ist nützlich für Objekte, die spezifisch für eine einzelne Arbeitseinheit sind und möglicherweise zusätzliche logische Arbeitseinheiten verschachtelt werden müssen. Jede verschachtelte Lebensdauer-Scope erhält eine neue Instanz der registrierten Abhängigkeit.
Wenn man die Instanz pro Lebenszeit des Scopes parst, gibt es in jedem verschachtelten Scope nur eine Instanz (z. B. pro Arbeitseinheit).
Instance-per-Matching-Lebensdauer
Dies ähnelt dem Instance Per Lifetime Scope, aber die Kontrolle kann mit präziseren Instanzen geteilt werden. Wenn du einen verschachtelten Lebenszyklus erstellst, kannst du ihn beschriften oder ihm einen Namen geben. Eine Komponente mit per-Matching-Lifetime-Scope besitzt höchstens eine einzelne Instanz pro verschachtelten Lifetime-Scope, die einem bestimmten Namen entspricht. Dies ermöglicht die Erstellung von scoped Singletons, bei denen verschachtelte Zyklen Komponenten teilen können, ohne globale Instanzen zu erstellen.
Nützlich für einzelne Arbeitseinheiten, wie HTTP-Anfragen, die als verschachtelte Lebenszyklen erstellt werden. Wenn pro HTTP-Anfrage eine verschachtelte Lebensdauer erstellt wird, erhält jede Komponente mit per-Lifetime-Umfang pro HTTP-Anfrage eine Instanz. (Mehr zum Lebenszeitumfang pro Anfrage unten.)
In den meisten Anwendungen ist nur eine hierarchische Containerverschachtelung erforderlich, um eine Arbeitseinheit darzustellen. Wenn mehrere verschachtelte Ebenen benötigt werden (z. B. global->Request->Transaction), können Komponenten erstellt werden, die auf einer bestimmten Ebene über Tags geteilt werden.
Wenn ein verschachtelter Lebenszyklus gestartet wird, sind Tags mit diesem Lebenszyklus verknüpft. Du bekommst eine Ausnahme, wenn du versuchst, eine pro-Matching-Lifetime-Scope-Komponente zu lösen, obwohl es keinen korrekt benannten Lifetime-Scope gibt. (Wenn der Lebenszyklus des nicht gespeicherten Tags geparst wird, tritt eine Ausnahme auf.)
Instanz pro Anfrage
Einige Anwendungstypen haben natürlich eine "Anfrage"-Semantik, wie ASP.NET MVC. Unter diesen Anwendungsarten ist es hilfreich, eine Form von "Einzelspieler pro Anfrage" zu haben. Instanz pro Anfrage baut auf Instanz pro passendem Lebenszeitumfang auf, indem ein bekanntes Nutzdauer-Umfangstag, eine Registrierungsbequemlichkeitsmethode und Integration für gemeinsame Anwendungen bereitgestellt wird Typen (eine Instanz pro Anfrage wird auf dem Lebensdauerumfang pro Matching aufgebaut, indem ein bekanntes Lifetime-Tag, eine Registrierungsbequemlichkeitsmethode und Integration für gängige Anwendungstypen bereitgestellt wird). Im Wesentlichen ist es pro entsprechender Lebensdauer.
Das bedeutet, wenn es keine aktuelle Anfrage gibt und Sie eine Komponente anhand von Instanz pro Anfrage parsen, wird eine Ausnahme ausgelöst. Es gibt eine ausführliche FAQ, die erklärt, wie man mit Lebensdauern pro Anfrage arbeitet.
Der Hyperlink-Login ist sichtbar.
Instanz pro Besitz
Besitzender impliziter Beziehungstyp, wodurch ein neuer verschachtelter Lebenszyklus entsteht. Abhängigkeiten können durch Registrierung bei Instanz-per-Owned auf die Host-Instanz beschränkt werden.
In diesem Beispiel wird der ServiceForHandler-Service auf die Lebensdauer der eigenen MessageHandler-Instanz scoped.
Fadenumfang
Du kannst darauf zurückgreifen
Der Hyperlink-Login ist sichtbar.
Tatsächlicher Kampf
Ich benutze den Modus Instanz pro Lebenszeit-Scope.
In winform verwendet der Aufruf jedes Mal einen Datenbankkontext, wie in der Abbildung unten gezeigt:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Im Fall von Multithreading und Nebenwirkung treten Sie, wenn Sie denselben Datenbankkontext verwenden, auf Ausnahmen beim Hinzufügen, Löschen, Ändern oder Überprüfen der Datenbank.
Ich möchte, dass Autofac jedes Mal, wenn ich auf den Button klicke, ein neues Objekt zurückgibt, der Code ist wie folgt:
Wie unten gezeigt:
(Ende) |