Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 24701|Antwort: 1

[Quelle] Autofac steuert Umfang und Lebensdauer

[Link kopieren]
Veröffentlicht am 19.09.2020, 12:51:52 | | | |
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)




Vorhergehend:.NET/C# Wassermarkierter Text zum Kacheln von Bildern
Nächster:ASP.NET Den Zugriff auf Logdateien in Form von URLs verbieten
Veröffentlicht am 08.9.2022 09:58:24 |
Genau das, was wir brauchen
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com