|
|
Geplaatst op 14-09-2018 13:22:21
|
|
|
|

De instantiescope bepaalt hoe services worden gedeeld tussen verzoeken.
Origineel adres:http://docs.autofac.org/en/latest/lifetime/instance-scope.html
Eén instantie per afhankelijkheid
Met deze optie wordt elke keer dat de dienst wordt aangevraagd een nieuwe instantie teruggestuurd. Gebruik InstancePerDependency(). Dit is de standaardoptie. De onderstaande code, regels 2 en 3, zijn gelijkwaardig.
De volgende code genereert een nieuwe instantie voor elke lus, in totaal 100 instanties.
Enkele instantie
Gebruik deze optie om een service aan te vragen in de root- of geneste scope, waarbij beide dezelfde instantie teruggeven. Gebruik SingleInstance() om dit te specificeren.
De onderstaande code, w1 en w2, zijn altijd hetzelfde object, en er is slechts één instantie van de Worker-klasse in 100 lussen.
Eén instantie per levenscyclusscope
Gebruik deze optie om een service aan te vragen in een specifieke ILifetimeScope, waarbij slechts één instantie wordt teruggegeven. Gebruik InstancePerLifetimeScope(). In de volgende code is de 100 keer w1 in scope1 hetzelfde object, en de 100 keer w2 in scope2 hetzelfde object, maar w1 en w2 zijn niet hetzelfde object.
Eén instantie per matching-levenscyclusbereik
Vergelijkbaar met [één instantie per levenscyclusscope] hierboven, maar met meer controle. Gebruik deze optie om het ILifetimeScope-object een tag te laten ontvangen. Er is slechts één geval binnen het bereik van de tagwedstrijd. Gebruik de InstancePerMatchingLifetimeScope()-methode.
In de onderstaande code zijn w1 en w2 hetzelfde, zijn w3 en w4 hetzelfde, maar w1 en w3 zijn verschillend.
De juiste markup moet worden opgegeven bij het parsen, en de volgende code geeft een uitzondering.
Eén instantie per verzoek
Sommige applicaties hebben van nature Request-semantiek, zoals ASP.NET MVC- of WebForm-applicaties. [Eén instantie per verzoek] wordt geïmplementeerd op basis van [één instantie per matchende levenscyclusbereik], door scope-markers, registratiefuncties en gemeenschappelijke type-integratie te bieden. In wezen [één instantie per overeenkomende levenscyclusbereik].
ASP.NET Core gebruikt één instantie per levenscyclusscope in plaats van één instantie per verzoek.
Eén instantie per Owned
Het<T> type Owned impliciete associatie creëert geneste levenscyclusbereiken. Met instance-per-owned registratie kun je afhankelijkheden beperken tot owned instances.
In dit geval is de ServiceForHandler-service beperkt tot de scope van de MessageHandler-instantie.
Draadbereik
Autofac kan de objecten van thread A dwingen om niet aan de afhankelijkheden van thread B te voldoen.
Laat vervolgens ieder zijn eigen levenslange scope creëren
Belangrijk: In een multithreaded scenario moet je oppassen dat je de ouderscope niet opruimt.Anders kunnen de subscopes in de afgeleide thread de service niet oplossen.
Elke thread heeft zijn eigen instantie van MyThreadScopedComponent, die in wezen een lifecycle-scoped singleton is. Instanties binnen scope worden niet extern geleverd, dus het is makkelijk om componenten geïsoleerd te houden tussen threads.
Door de ILifetimeScope-parameter toe te voegen, kan het ouderbereik worden geïnjecteerd in de code die de thread genereert, en zal Autofac automatisch het huidige bereik injecteren, dat vervolgens gebruikt kan worden om geneste scopes te creëren.
Als je het verder wilt controleren, kun je [één instantie per bijpassende levenscyclusbereik] gebruiken om thread-scoped componenten te koppelen aan interne levenscyclusscopes, zoals weergegeven in de figuur:
De "Context" in het diagram is het levenscyclusbereik dat is gecreëerd door de BeginLifetimeScope-methode.
|
Vorig:Effecten van de muisklik aan de voorkant: vrijheid, democratie, welvaartVolgend:{"error_msg": "IAM-certificering mislukt"}
|