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) |