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