Labs raksts, lai uzzinātu par Autofac vadības tvērumu un dzīves ciklu, dzīves cikla tvērums ir līdzvērtīgs darba vienībai jūsu lietojumprogrammā, darba vienība sāks dzīves cikla tvērumu sākumā, un pēc tam pakalpojumi, kuriem nepieciešama šī darba vienība, tiek parsēti no dzīves cikla tvēruma.
Mūža tvērumi
Izveidojiet Lifetme tvērumus
Izveidojiet tvērumu manuāli un Iznīcināšana. Mūža tvērumi ir vienreizlietojami, un tie izseko komponentu iznīcināšanu, tāpēc pārliecinieties, ka vienmēr zvanāt "Dispose()" vai iesaiņojiet tos "izmantojot" paziņojumos.
Etiķetes kalpošanas laiks
Dažreiz daži pakalpojumi var būt jākoplieto darba vienībā, bet nevēlaties izmantot globālās koplietošanas ērtības, piemēram, vientuļnieka režīmu. Piemēram, tīmekļa lietojumprogrammas dzīves cikls katram pieprasījumam, tādā gadījumā varat izmantot InstancePerMatchingLifetimeScope, lai identificētu savu dzīves ciklu un pakalpojumu.
Piemēram, ir komponents, kas sūta e-pastu, un transakcijas loģikai ir jāsūta ziņojumi vairākas reizes, lai pasta pakalpojumu varētu koplietot katrā loģiskās transakcijas sadaļā. Ja nevēlaties, lai e-pasta komponents būtu globāls singletons, varat to iestatīt šādi.
Reģistrāciju pievienošana mūža darbības jomai
Autofac ļauj pievienot "lidojumā", veidojot dzīves ciklu. Tas var jums palīdzēt, ja jums ir nepieciešams veikt sava veida "vietas metināšanas" ierobežotas reģistrācijas ignorēšanu vai ja jums parasti ir nepieciešamas papildu lietas tādā jomā, kuru nevēlaties reģistrēt visā pasaulē. To var izdarīt, nododot lambda uz BeginLifetimeScope(), kas aizņem ContainerBuilder un pievieno reģistrācijas. (Veidojot dzīves ciklu, reģistrējiet papildu pakalpojumus bez globālās reģistrācijas)
Instances tvērums
Instances tvērums nosaka, kā instance tiek koplietota starp pieprasījumiem. Pieprasot pakalpojumu, autofac var atgriezt vienu instances tvērumu, jaunu instanci katram atkarības tvērumam vai atsevišķu kontekstu, piemēram, pavedienu vai HTTP pieprasījumu par mūža tvērumu. Tas attiecas uz gadījumiem, kas atgriezti no skaidra Resolve() izsaukuma, kā arī uz instancēm, ko konteiners izveidojis iekšēji, lai apmierinātu cita komponenta atkarības.
- Instance katrai atkarībai
- Viena instance
- Instance par mūža tvērumu
- Instance katram atbilstošam kalpošanas ilgumam
- Instance katram pieprasījumam
- Instance katram piederošajam
- Vītnes darbības joma
Instance katrai atkarībai
Citos konteineros to sauc arī par īslaicīgu vai "rūpnīcu", un tas atgriež unikālu gadījumu katru reizi, kad tiek pieprasīts pakalpojums. Ja nav norādīts dzīves cikls, tā ir noklusējuma darbība.
Katra atkarība Atrisināt atgriež jaunu komponentu.
Viena instance
Viena un tā pati instance tiek atgriezta visos pieprasījumos un ligzdotajos tvērumos.
Instance par mūža tvērumu
Šo tvērumu var lietot ligzdotajiem tvērumiem. Dzīves ilguma tvēruma komponentam ligzdotajā tvērumā ir ne vairāk kā viena instance. Tas ir noderīgi objektiem, kas raksturīgi vienai darba vienībai, kuriem, iespējams, būs nepieciešams ligzdot papildu loģiskās darba vienības. Katrs ligzdotais kalpošanas laiks iegūs jaunu reģistrētās atkarības instanci.
Analizējot mūža tvēruma instances komponentu, katrā ligzdotajā tvērumā ir tikai viena instance (piemēram, uz darba vienību).
Instance katram atbilstošam kalpošanas ilgumam
Tas ir līdzīgs Instance Per Lifetime Scope, bet vadību var koplietot ar precīzākām instancēm. Veidojot ligzdotu dzīves ciklu, varat tam piešķirt etiķeti vai nosaukumu. Komponentam ar atbilstības mūža tvērumu būs ne vairāk kā viens gadījums uz ligzdoto kalpošanas laiku, kas atbilst konkrētam nosaukumam. Tas ļauj izveidot tvēruma singletonus, kur ligzdotie cikli var koplietot komponentus, neveidojot globālas instances.
Noderīga atsevišķām darba vienībām, piemēram, http pieprasījumiem, kas izveidoti kā ligzdoti dzīves cikli. Ja katram HTTP pieprasījumam tiek izveidots ligzdots kalpošanas laiks, tad jebkuram komponentam ar dzīves ilguma tvērumu katram HTTP pieprasījumam būs instance. (Vairāk par katra pieprasījuma dzīves ilgumu zemāk.)
Lielākajā daļā lietojumprogrammu ir nepieciešama tikai viena hierarhiska konteinera ligzdošana, lai attēlotu darba vienību. Ja ir nepieciešami vairāki ligzdoti līmeņi (piemēram, global->request->transaction), var izveidot komponentus, lai tos kopīgotu noteiktā līmenī, izmantojot tagus.
Kad tiek sākts ligzdotais dzīves cikls, tagi tiek saistīti ar šo dzīves ciklu. Jūs saņemsiet izņēmumu, ja mēģināsit atrisināt atbilstības mūža tvēruma komponentu, ja nav pareizi nosaukta mūža tvēruma. (Ja nesaglabātā taga dzīves cikls tiek parsēts, tiks parādīts izņēmums.)
Instance katram pieprasījumam
Dažiem lietojumprogrammu veidiem, protams, ir "pieprasījuma" tipa semantika, piemēram, ASP.NET MVC. Starp šiem lietojumprogrammu veidiem ir noderīgi, ja ir kāda veida "singleton katram pieprasījumam". Instance katram pieprasījumam tiek veidota virs instances uz atbilstošu kalpošanas laiku, nodrošinot labi zināmu mūža tvēruma tagu, reģistrācijas ērtības metodi un integrāciju kopīgai lietojumprogrammai Tipi (viena instance katram pieprasījumam tiek veidota papildus atbilstošajam kalpošanas laikam, nodrošinot labi zināmu mūža tagu, reģistrācijas ērtības metodi un integrāciju kopīgiem lietojumprogrammu tipiem). Būtībā tas ir atbilstošs mūža apjomam.
Tas nozīmē, ka, ja nav pašreizējā pieprasījuma un parsējat komponentu, kas reģistrēts, pamatojoties uz katru gadījumu, tiks izmests izņēmums. Ir detalizēti uzdotie jautājumi, kuros aprakstīts, kā strādāt ar pieprasījuma kalpošanas laiku.
Hipersaites pieteikšanās ir redzama.
Instance katram piederošajam
Īpašumā esošs netiešais relācijas tips, izveidojot jaunu ligzdotu dzīves ciklu. Atkarības var ierobežot līdz resursdatora instancei, reģistrējoties instancē katram piederošajam.
Šajā piemērā pakalpojums ServiceForHandler tiks tvērums līdz īpašumā esošās MessageHandler instances kalpošanas laikam.
Vītnes darbības joma
Jūs varat atsaukties uz to
Hipersaites pieteikšanās ir redzama.
Faktiskā cīņa
Es izmantoju režīmu Instance Per Lifetime Scope.
Winform, kad zvans tiek izpildīts, tas katru reizi izmanto datu bāzes kontekstu, kā parādīts zemāk redzamajā attēlā:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Vairāku pavedienu un vienlaicīguma gadījumā, ja izmantojat vienu un to pašu db kontekstu, jūs saskarsieties ar izņēmumiem, pievienojot, dzēšot, modificējot vai pārbaudot datu bāzi.
Es vēlos, lai autofac atgrieztu jaunu objektu katru reizi, kad noklikšķinu uz pogas, kods ir šāds:
Kā parādīts zemāk:
(Beigas) |