Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 24701|Svar: 1

[Källa] Autofac styr omfattning och livslängd

[Kopiera länk]
Publicerad den 2020-9-19 12:51:52 | | | |
En bra artikel att lära sig om Autofacs kontrollomfång och livscykel, livscykelomfång motsvarar en arbetsenhet i din applikation, en arbetsenhet startar livscykelomfånget från början, och sedan skiljs de tjänster som kräver den arbetsenheten från livscykelomfånget.

Livstidssikten

Skapa Lifetme-teleskop

Skapa ett teleskop manuellt och använd avfallshantering. Livstidsteleskop är förbrukningsbara och de spårar komponenthantering, så se alltid till att anropa "Dispose()" eller slå in dem i "använda"-uttalanden.




Etikettens livstidssikten

Ibland kan du behöva dela vissa tjänster inom en arbetsenhet, men du vill inte använda globala delningsbekvämligheter, som singleton-läge. Till exempel livscykeln per förfrågan för en webbapplikation, i så fall kan du använda InstancePerMatchingLifetimeScope för att identifiera din livscykel och tjänst.

Till exempel finns det en komponent som skickar e-post, och transaktionslogiken måste skicka meddelanden flera gånger, så att e-posttjänsten kan delas i varje logisk transaktionsskiva. Om du inte vill att e-postkomponenten ska vara en global singleton kan du ställa in den så här.



Att lägga till registreringar i en livstidsomfattning

Autofac låter dig lägga till "on the fly" när du skapar en livscykel. Detta kan hjälpa dig när du behöver göra en slags "punktsvetsning" med begränsad registreringsöverskrivning eller om du generellt bara behöver lite extra saker i ett teleskop som du inte vill registrera globalt. Du gör detta genom att skicka en lambda till BeginLifetimeScope() som tar en ContainerBuilder och lägger till registreringar. (När du skapar en livscykel, registrera ytterligare tjänster utan global registrering)



Instansomfattning

Instansens omfattning avgör hur en instans delas mellan förfrågningar. När en tjänst begärs kan autofac returnera ett enskilt instansomfång, en ny instans per beroendeomfare eller en singel i ett sammanhang, såsom en tråd eller en HTTP-förfrågan per livstidsomfång. Detta gäller för instanser som returneras från ett explicit Resolve()-anrop samt instanser som skapas internt av containern för att uppfylla beroendena hos en annan komponent.

  • Instans per beroende
  • Enskild instans
  • Instans per livstidsomfattning
  • Instans per matchningslivstidsomfattning
  • Instans per förfrågan
  • Instans per ägd
  • Trådomfängelse


Instans per beroende

Även kallad transient eller 'factory' i andra containrar, returnerar den en unik instans varje gång en tjänst begärs. Om det inte finns någon specificerad livscykel är detta standardbeteendet.



Varje Resolve-beroende returnerar en ny komponent.



Enskild instans

Samma instans returneras över alla förfrågningar och nästlade scopes.




Instans per livstidsomfattning

Detta omfängelse kan tillämpas på nästlade skådsar. Komponenten, som är ett per-livstidsomfång, har maximalt en instans inom det nästlade omfånget. Detta är användbart för objekt specifika för en enskild arbetsenhet som kan behöva nästla ytterligare logiska arbetsenheter. Varje nästlad livstidsscope får en ny instans av det registrerade beroendet.



När du parsar per livstidsscope instance component finns det bara en instans i varje nästlad scope (t.ex. per arbetsenhet).


Instans per matchningslivstidsomfattning

Detta liknar Instance Per Lifetime Scope, men kontrollen kan delas med mer precisa instanser. När du skapar en nästlad livscykel kan du märka den eller ge den ett namn. En komponent med per-matching-livstidsscope kommer att ha högst en instans per nästlad livstidsomfattning som matchar ett givet namn。 Detta möjliggör skapandet av scoped singletons, där nästlade cykler kan dela komponenter utan att skapa globala instanser.

Användbart för enskilda arbetsenheter, såsom http-förfrågningar, skapade som nästlade livscykler. Om en nästlad livstid skapas per HTTP-förfrågan, kommer varje komponent med per-livstidsomfång att ha en instans per HTTP-förfrågan. (Mer om livslängden per begäran nedan.)

I de flesta tillämpningar behövs endast en hierarkisk containerinbäddning för att representera en arbetsenhet. Om flera nästlade nivåer krävs (t.ex. global->request->transaktion) kan komponenter skapas för att delas på en specifik nivå via taggar.



När en nästlad livscykel startas kopplas taggar till den livscykeln. Du får ett undantag om du försöker lösa en per-matching-lifetime-scope-komponent när det inte finns någon korrekt namngiven livslängdsscope. (Om livscykeln för den ej sparade taggen tolkas kommer ett undantag att inträffa.)



Instans per förfrågan

Vissa applikationstyper har naturligt en "request"-typ av semantik, såsom ASP.NET MVC. Bland dessa applikationstyper är det hjälpsamt att ha någon form av "singleton per request". Instans per förfrågan bygger vidare på instans per matchande livstidsomfattning genom att tillhandahålla en välkänd livstidsomfångstagg, en registreringsmetod och integration för gemensam applikation typer (en instans per förfrågan byggs ovanpå livslängden per matchning genom att tillhandahålla en välkänd livstidstagg, en registreringsmetod för bekvämlighet och integration för vanliga applikationstyper). I princip är det per motsvarande livslängdsomfattning.

Detta innebär att om det inte finns någon aktuell förfrågan, och du tolkar en komponent registrerad baserat på instans per förfrågan, kommer ett undantag att kastas. Det finns en detaljerad FAQ som beskriver hur man arbetar med livslängder per begäran.

Inloggningen med hyperlänken är synlig.



Instans per ägd

Ägd implicit relationstyp, vilket skapar en ny inbäddad livscykel. Beroenden kan begränsas till värdinstansen genom att registrera sig hos instans-per-owned.



I detta exempel kommer ServiceForHandler-tjänsten att vara begränsad till livslängden för den ägda MessageHandler-instansen.



Trådomfängelse

Du kan hänvisa till den

Inloggningen med hyperlänken är synlig.

Faktiska striderna

Jag använder Instans per livstidsomfång.

I winform, när anropet körs, används en databaskontext varje gång, som visas i figuren nedan:



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

När det gäller multitrådning och samtidighet, om du använder samma databaskontext, kommer du att stöta på undantag när du lägger till, raderar, ändrar eller kontrollerar databasen.

Jag vill att Autofac ska returnera ett nytt objekt varje gång jag klickar på knappen, koden är följande:


Som visas nedan:



(Slut)




Föregående:.NET/C# Vattenmärkt text för att kakela bilder
Nästa:ASP.NET Förbjud åtkomst till loggfiler i form av URL:er
Publicerad den 2022-9-8 09:58:24 |
Precis vad vi behöver
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com