Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 24701|Svar: 1

[Kilde] Autofac styrer omfang og levetid

[Kopier link]
Opslået den 19-9-2020 12:51:52 | | | |
En god artikel at lære om Autofac-kontrolomfang og livscyklus; livscyklusomfang svarer til en arbejdsenhed i din applikation, en arbejdsenhed starter livscyklusomfanget fra starten, og derefter bliver de tjenester, der kræver den arbejdsenhed, parseret fra livscyklusomfanget.

Livstidssigter

Skab Lifetme-teleskoper

Opret et sigte manuelt og Disposal. Livstidsteleskoper er engangs og registrerer bortskaffelse af komponenter, så sørg altid for at kalde "Bortskaff()" eller pakke dem ind i "bruger"-beskeder.




Label Lifetime Scopes

Nogle gange kan du have brug for at dele nogle tjenester inden for en arbejdsenhed, men du ønsker ikke at bruge globale delingsbekvemmeligheder, såsom singleton-tilstand. For eksempel den per-request livscyklus for en webapplikation, hvor du kan bruge InstancePerMatchingLifetimeScope til at identificere din livscyklus og service.

For eksempel er der en komponent, der sender mail, og transaktionslogikken skal sende beskeder flere gange, så mailtjenesten kan deles i hver logisk transaktionsskive. Hvis du ikke vil have, at e-mailkomponenten skal være en global singleton, kan du sætte den således.



Tilføjelse af registreringer til et livstidsomfang

Autofac giver dig mulighed for at tilføje "on the fly", når du opretter en livscyklus. Det kan hjælpe dig, når du skal lave en slags "punktsvejsning" med begrænset registrering, eller hvis du generelt bare har brug for noget ekstra i et oscilloskop, som du ikke vil registrere globalt. Det gør du ved at sende en lambda til BeginLifetimeScope(), som tager en ContainerBuilder og tilføjer registreringer. (Når du opretter en livscyklus, registrer yderligere tjenester uden global registrering)



Instansens omfang

Instansens omfang bestemmer, hvordan en instans deles mellem forespørgsler. Når man anmoder om en service, kan autofac returnere et enkelt instans-scope, en ny instans per dependency scope eller en singleton i en kontekst, såsom en tråd eller en HTTP-anmodning per levetid-scope. Dette gælder for instanser, der returneres fra et eksplicit Resolve()-kald samt instanser, der oprettes internt af containeren for at opfylde afhængighederne af en anden komponent.

  • Instans per afhængighed
  • Enkeltinstans
  • Instans per livstidsomfang
  • Instans pr. matchende levetidsomfang
  • Instans pr. anmodning
  • Instans pr. eje
  • Trådomfang


Instans per afhængighed

Også kaldet transient' eller 'factory' i andre containere, returnerer den en unik instans hver gang en service anmodes. Hvis der ikke er angivet en livscyklus, er dette standardadfærden.



Hver Resolve-afhængighed returnerer en ny komponent.



Enkeltinstans

Den samme instans returneres på tværs af alle forespørgsler og indlejrede scopes.




Instans per livstidsomfang

Dette scope kan anvendes på indlejrede scopes. Per-lifetime scope-komponenten har maksimalt én instans inden for det indlejrede scope. Dette er nyttigt for objekter, der er specifikke for en enkelt arbejdsenhed, og som måske skal indlejre yderligere logiske arbejdsenheder. Hver indlejret levetidsscope vil modtage en ny instans af den registrerede afhængighed.



Når du parser instansen for et per-lifetime scope, er der kun én instans i hvert indbygget scope (f.eks. pr. arbejdsenhed).


Instans pr. matchende levetidsomfang

Dette ligner Instance Per Lifetime Scope, men kontrollen kan deles med mere præcise instanser. Når du opretter en indlejret livscyklus, kan du mærke den eller give den et navn. En komponent med per-matching-levetid-omfang vil højst have én instans pr. indlejret livstidsomfang, der matcher et givet navn. Dette muliggør oprettelsen af scoped singletons, hvor indlejrede cyklusser kan dele komponenter uden at skabe globale instanser.

Nyttig til enkeltstående arbejdsenheder, såsom http-forespørgsler, oprettet som indlejrede livscyklusser. Hvis en indlejret levetid oprettes pr. HTTP-anmodning, vil enhver komponent med per-livstidsomfang have en instans pr. HTTP-anmodning. (Mere om levetiden pr. anmodning nedenfor.)

I de fleste applikationer er kun én hierarkisk containerindlejring nødvendig for at repræsentere en arbejdsenhed. Hvis flere indlejrede niveauer er nødvendige (f.eks. global->request->transaktion), kan komponenter oprettes til deling på et specifikt niveau via tags.



Når en indlejret livscyklus startes, er tags knyttet til denne livscyklus. Du får en undtagelse, hvis du forsøger at løse en per-matching-lifetime-scope-komponent, når der ikke findes et korrekt navngivet levetidsscope. (Hvis livscyklussen for det ikke-gemte tag bliver parset, vil der opstå en undtagelse.)



Instans pr. anmodning

Nogle applikationstyper har naturligt en "request"-type semantik, såsom ASP.NET MVC. Blandt disse ansøgningstyper er det nyttigt at have en form for "singleton per request". Instans pr. anmodning bygger oven på instans pr. matchende levetidsscope ved at levere et velkendt livstidsomfangstag, en registreringsmetode og integration til fælles applikationer typer (én instans pr. anmodning bygges oven på det per-matchende levetidsomfang ved at tilbyde et velkendt livstidstag, en registreringsmetode og integration for almindelige applikationstyper). Grundlæggende er det efter tilsvarende levetid.

Det betyder, at hvis der ikke er nogen aktuel anmodning, og du parser en komponent registreret baseret på instans pr. anmodning, vil der blive kastet en undtagelse. Der findes en detaljeret FAQ, der forklarer, hvordan man arbejder med levetider pr. anmodning.

Hyperlink-login er synlig.



Instans pr. eje

Ejer implicit relationstype, hvilket skaber en ny indlejret livscyklus. Afhængigheder kan begrænses til værtsinstansen ved at registrere sig hos instance-per-owned.



I dette eksempel vil ServiceForHandler-tjenesten være scoped til levetiden for den ejede MessageHandler-instans.



Trådomfang

Du kan henvise til det

Hyperlink-login er synlig.

Selve kampen

Jeg bruger Instance Per Lifetime Scope-tilstanden.

I winform bruger kaldet, når det udføres, en databasekontekst hver gang, som vist i figuren nedenfor:



_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655

I tilfælde af multitråding og samtidighed, hvis du bruger den samme databasekontekst, vil du støde på undtagelser, når du tilføjer, sletter, ændrer eller tjekker databasen.

Jeg vil have, at autofac returnerer et nyt objekt hver gang jeg klikker på knappen, koden er som følger:


Som vist nedenfor:



(Slut)




Tidligere:.NET/C# Vandmærket tekst til flisebelægning af billeder
Næste:ASP.NET Forbyd adgang til logfiler i form af URL'er
Opslået den 8-9-2022 09:58:24 |
Præcis hvad vi har brug for
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com