Een goed artikel om te leren over de scope en levenscyclus van Autofac: lifecycle scope is gelijkwaardig aan een eenheid van werk in je applicatie; een eenheid van werk start de lifecycle scope aan het begin, en vervolgens worden de diensten die die eenheid van werk vereisen geanalyseerd van de lifecycle scope.
Levenslange scopen
Maak Lifetme-scopes
Maak handmatig een scope aan en gebruik Dump. Levenslange scopes zijn wegwerpbaar en houden de verwijdering van componenten bij, dus zorg ervoor dat je altijd "Dispose()" aanroept of ze verpakt in "useing"-instructies.
Label Lifetime Scopes
Soms moet je bepaalde diensten delen binnen een werkeenheid, maar je wilt geen gebruik maken van globale deelgemakken, zoals singleton-modus. Bijvoorbeeld de levenscyclus per verzoek van een webapplicatie, in welk geval je InstancePerMatchingLifetimeScope kunt gebruiken om je levenscyclus en service te identificeren.
Er is bijvoorbeeld een component die mail verzendt, en de transactielogica moet berichten meerdere keren versturen, zodat de mailservice in elke logische transactieschijf gedeeld kan worden. Als je niet wilt dat de e-mailcomponent een globale singleton wordt, kun je het als volgt instellen.
Registraties toevoegen aan een levenslange scope
Autofac stelt je in staat om "on the fly" toe te voegen bij het aanmaken van een levenscyclus. Dit kan je helpen als je een soort "spot-weld" beperkte registratie-override-uitvoering moet doen of als je gewoon extra dingen nodig hebt in een scope die je niet globaal wilt registreren. Dit doe je door een lambda door te geven aan BeginLifetimeScope() die een ContainerBuilder neemt en registraties toevoegt. (Bij het aanmaken van een levenscyclus registreer je extra diensten zonder globale registratie)
Instantiebereik
De instantiescope bepaalt hoe een instantie wordt gedeeld tussen verzoeken. Bij het aanvragen van een service kan Autofac een enkele instantiescope teruggeven, een nieuwe instantie per afhankelijkheidsscope, of een singleton in een context, zoals een thread of een HTTP-verzoek per levenslange scope. Dit geldt zowel voor instanties die worden teruggegeven door een expliciete Resolve()-aanroep, evenals voor instanties die intern door de container zijn aangemaakt om aan de afhankelijkheden van een andere component te voldoen.
- Instantie per afhankelijkheid
- Enkele instantie
- Scope van instantie per levensduur
- Instantie per Matching Levensduurbereik
- Instantie per verzoek
- Instance Per Owned
- Thread Scope
Instantie per afhankelijkheid
Ook wel transient of 'factory' genoemd in andere containers, geeft het een unieke instantie terug telkens wanneer een dienst wordt aangevraagd. Als er geen levenscyclus is gespecificeerd, is dit het standaardgedrag.
Elke Resolve-afhankelijkheid levert een nieuwe component terug.
Enkele instantie
Dezelfde instantie wordt teruggegeven voor alle verzoeken en geneste scopes.
Scope van instantie per levensduur
Deze scope kan worden toegepast op geneste scopes. De per-lifetime scopecomponent heeft maximaal één instantie binnen de geneste scope. Dit is nuttig voor objecten die specifiek zijn voor een enkele eenheid van werk die mogelijk extra logische eenheden moeten nesten. Elke geneste levensduurscope krijgt een nieuwe instantie van de geregistreerde afhankelijkheid.
Wanneer je de per lifetime scope instance component pars, is er maar één instantie per geneste scope (bijvoorbeeld per eenheid werk).
Instantie per Matching Levensduurbereik
Dit lijkt op Instance Per Lifetime Scope, maar controle kan gedeeld worden met preciezere instanties. Wanneer je een geneste levenscyclus maakt, kun je deze labelen of een naam geven. Een component met per-matching-lifetime scope heeft hooguit één instantie per geneste lifetime scope die overeenkomt met een gegeven naam。 Dit maakt het mogelijk om scoped singletons te creëren, waarbij geneste cycli componenten kunnen delen zonder globale instanties te creëren.
Nuttig voor losse eenheden van werk, zoals http-verzoeken, die als geneste levenscycli worden gemaakt. Als per HTTP-verzoek een geneste levensduur wordt aangemaakt, zal elke component met per-lifetime scope per HTTP-verzoek een instantie hebben. (Meer over de levensduur per verzoek hieronder.)
In de meeste toepassingen is slechts één hiërarchische container-genesing nodig om een eenheid van werk te representeren. Als meerdere geneste niveaus nodig zijn (bijvoorbeeld global->request->transaction), kunnen componenten worden aangemaakt om op een specifiek niveau via tags gedeeld te worden.
Wanneer een geneste levenscyclus wordt gestart, worden tags aan die levenscyclus gekoppeld. Je krijgt een uitzondering als je probeert een per-matching-lifetime-scope op te lossen terwijl er geen correct benoemde lifetimescope is. (Als de levenscyclus van de niet-opgeslagen tag wordt geanalyseerd, zal er een uitzondering optreden.)
Instantie per verzoek
Sommige applicatietypen hebben van nature een "request"-type semantiek, zoals ASP.NET MVC. Onder deze aanvraagtypen is het handig om een vorm van "singleton per verzoek" te hebben. Instance per request bouwt voort op instance per matching lifetime scope door een bekende lifetime scope-tag te bieden, een registratiegemakmethode en integratie voor een gemeenschappelijke applicatie te bieden types (één instantie per verzoek wordt bovenop de per-matching lifetime scope gebouwd door een bekende lifetime tag te bieden, een registratiegemakmethode en integratie voor veelvoorkomende applicatietypen). In wezen is het per matching lifetime scope.
Dit betekent dat als er geen huidig verzoek is en je een component parst die op basis van instantie per verzoek wordt geanalyseerd, er een uitzondering wordt gegooid. Er is een gedetailleerde FAQ die uitlegt hoe je werkt met levenstijden per verzoek.
De hyperlink-login is zichtbaar.
Instance Per Owned
Een bezittend impliciet relatietype, waardoor een nieuwe geneste levenscyclus ontstaat. Afhankelijkheden kunnen beperkt worden tot de hostinstantie door te registreren bij instance-per-owned.
In dit voorbeeld wordt de ServiceForHandler-service scoped op de levensduur van de eigendom van de MessageHandler-instantie.
Thread Scope
Je kunt er ook naar verwijzen
De hyperlink-login is zichtbaar.
Daadwerkelijke gevechten
Ik gebruik de Instance Per Lifetime Scope-modus.
In winform gebruikt het bij het uitvoeren van de aanroep telkens een databasecontext, zoals weergegeven in de onderstaande figuur:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 In het geval van multithreading en gelijktijdigheid, als je dezelfde databasecontext gebruikt, zul je uitzonderingen tegenkomen bij het toevoegen, verwijderen, aanpassen of controleren van de database.
Ik wil dat Autofac elke keer dat ik op de knop klik een nieuw object terugstuurt, de code is als volgt:
Zoals hieronder getoond:
(Einde) |