Hea artikkel, et õppida Autofaci juhtimisulatuse ja elutsükli kohta, elutsükli ulatus on sinu rakenduses samaväärne tööühikuga, tööühik alustab elutsükli ulatust algusest ning seejärel parsitakse teenused, mis vajavad seda tööühikut, elutsükli ulatusest.
Eluaegsed skoobid
Loo Lifetme teleskoopid
Loo käsitsi sihik ja hävita. Eluaegsed teleskoobid on ühekordsed ja jälgivad komponentide utiliseerimist, seega kindlasti helista alati "Dispose()" või pakkige need "using" lausetesse.
Plaadifirma eluea ulatused
Mõnikord võib vaja minna mõningaid teenuseid tööüksuse sees jagada, kuid sa ei taha kasutada globaalseid jagamise mugavusi, nagu üksikrežiim. Näiteks veebirakenduse päringupõhine elutsükkel, mille puhul saate kasutada InstancePerMatchingLifetimeScope'i, et tuvastada oma elutsükkel ja teenus.
Näiteks on olemas komponent, mis saadab kirju, ja tehinguloogika peab saatma sõnumeid mitu korda, nii et meiliteenust saab jagada igas loogilises tehingulõigus. Kui sa ei taha, et e-posti komponent oleks globaalne üksik, saad selle seadistada järgmiselt.
Registreeringute lisamine eluaegsesse ulatusse
Autofac võimaldab lisada "jooksvalt" elutsükli loomisel. See võib aidata, kui on vaja teha mingisugust "punktkeevituse" piiratud registreerimise ülekirjutust või kui vajad lihtsalt lisavarustust teleskoobis, mida sa globaalselt registreerida ei taha. Seda teed, saates lambda BeginLifetimeScope()-le, mis võtab ContainerBuilderi ja lisab registreerimised. (Elutsükli loomisel registreeri täiendavad teenused ilma globaalse registreerimiseta)
Eksemplari ulatus
Instantsi ulatus määrab, kuidas instants jagatakse päringute vahel. Teenuse taotlemisel võib autofac tagastada ühe instantsi ulatuse, uue instantsi sõltuvusulatuse kohta või ühe üksiku konteksti, näiteks lõime või HTTP päringu eluea ulatuse kohta. See kehtib nii eksemplaridele, mis tagastatakse eksplicitsetest Resolve() kutsest, kui ka instantsi sisemiselt loodud instantside kohta, et rahuldada teise komponendi sõltuvusi.
- Instants sõltuvuse kohta
- Üksik instants
- Eksemplari eluea ulatus
- Instantsi sobitamise eluea ulatus
- Instants päringu kohta
- Instants omanduses olevate instantside kaupa
- Lõime ulatus
Instants sõltuvuse kohta
Teistes konteinerites nimetatakse seda ka transient' või 'factory' ning iga kord, kui teenust taotletakse, tagastab see unikaalse instantsi. Kui elutsüklit pole määratud, on see vaikimisi käitumine.
Iga Resolve'i sõltuvus tagastab uue komponendi.
Üksik instants
Sama instants tagastatakse kõigi päringute ja pesastatud ulatuste puhul.
Eksemplari eluea ulatus
Seda ulatust saab rakendada pesastatud sihikutele. Eluea ulatuse komponendil on maksimaalselt üks instants pesastatud ulatuses. See on kasulik objektide puhul, mis on spetsiifilised ühele tööühikule, mis võivad vajada täiendavate loogiliste tööühikute pesastamise kohta. Iga pesastatud eluaegne skoop saab registreeritud sõltuvuse uue eksemplari.
Kui parsida eluea ulatuse instantsi komponenti, on igas pesastatud ulatuses ainult üks eksemplar (nt tööühiku kohta).
Instantsi sobitamise eluea ulatus
See on sarnane Instance Per Lifetime Scope'iga, kuid kontrolli saab jagada täpsemate instantsidega. Kui lood pesastatud elutsükli, saad sellele märgistada või nime anda. Komponendil, millel on sobitus-eluea ulatus, on maksimaalselt üks instants pesastatud eluea ulatuse kohta, mis vastab antud nimele。 See võimaldab luua ulatusega üksiksüsteeme, kus pesastatud tsüklid saavad jagada komponente ilma globaalseid instantse loomata.
Kasulik üksikute tööühikute, näiteks http-päringute puhul, mis on loodud pesastatud elutsüklitena. Kui iga HTTP-päringu kohta luuakse pesastatud eluiga, siis igal komponendil, millel on eluea ulatus, on iga HTTP-päringu kohta üks eksemplar. (Allpool lähemalt soovipõhise eluaegse ulatuse kohta.)
Enamikes rakendustes on tööühiku esindamiseks vaja vaid ühte hierarhilist konteineri pesastust. Kui on vaja mitut pesastatud taset (nt globaalne >päringu->tehing), saab luua komponente, mida jagatakse kindlal tasemel siltide kaudu.
Kui pesastatud elutsükkel algab, seostatakse sildid selle elutsükliga. Erandiks saad, kui püüad lahendada iga eluea ulatuse komponendi, kui õigesti nimetatud eluea ulatust pole. (Kui salvestamata sildi elutsükkel on parsitud, tekib erand.)
Instants päringu kohta
Mõnel rakendustüübil on loomulikult "taotluse" tüüpi semantika, näiteks ASP.NET MVC. Nende rakendustüüpide seas on kasulik, kui on olemas mingi "singleton per request" vorm. Iga päringu instants tugineb vastavale eluea ulatusele, pakkudes tuntud eluaegse ulatuse silti, registreerimismugavuse meetodit ja integratsiooni ühiskasutuseks tüübid (üks eksemplar iga päringu kohta ehitatakse vastavuse eluea ulatuse peale, pakkudes tuntud eluea silti, registreerimismugavuse meetodit ja integratsiooni levinud rakendustüüpide jaoks). Põhimõtteliselt kehtib see vastavalt vastavale eluaegsele ulatusele.
See tähendab, et kui praegust päringut ei ole ja sa parsid komponenti instants-per-request alusel, siis tehakse erand. Seal on üksikasjalik KKK, mis selgitab, kuidas töötada päringupõhiste eludega.
Hüperlingi sisselogimine on nähtav.
Instants omanduses olevate instantside kaupa
Omanduses olnud implitsiitne suhetüüp, luues uue pesastatud elutsükli. Sõltuvusi saab piirata host-instantsiga, registreerides instance-per-owned.
Selles näites on ServiceForHandler teenus ulatuses omanduses oleva MessageHandleri instantsi eluea ulatuses.
Lõime ulatus
Võid sellele viidata
Hüperlingi sisselogimine on nähtav.
Tegelik lahing
Kasutan Instance Per Lifetime Scope režiimi.
winformis, kui kõne käivitatakse, kasutatakse iga kord andmebaasi konteksti, nagu alloleval joonisel näidatud:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Mitmelõimelise ja paralleelsuse puhul, kui kasutate sama andmebaasi konteksti, tekivad erandeid andmebaasi lisamisel, kustutamisel, muutmisel või kontrollimisel.
Soovin, et autofac tagastaks iga kord, kui nuppu vajutan, uus objekt, kood on järgmine:
Nagu allpool näidatud:
(Lõpp) |