Dober članek za učenje o obsegu nadzora in življenjskem ciklu Autofac je, da je obseg življenjskega cikla enakovreden enoti dela v vaši aplikaciji, enota dela začne obseg življenjskega cikla na začetku, nato pa se storitve, ki zahtevajo to enoto dela, ločijo od obsega življenjskega cikla.
Življenjski pregledi
Ustvarite Lifetme Scopes
Ročno ustvari teleskop in Disposal. Življenjski teleskopi so za enkratno uporabo in sledijo odstranjevanju komponent, zato vedno pokliči "Dispose()" ali jih zavijte v stavke "upotrebujem".
Obseg življenjske dobe založbe
Včasih boste morda morali nekatere storitve deliti znotraj enote dela, vendar ne želite uporabljati globalnih udobij za deljenje, kot je način enojnega deljenja (singleton). Na primer, življenjski cikel na zahtevo spletne aplikacije, v tem primeru lahko uporabite InstancePerMatchingLifetimeScope za določitev svojega življenjskega cikla in storitve.
Na primer, obstaja komponenta, ki pošilja pošto, transakcijska logika pa mora večkrat poslati sporočila, da je mogoče poštno storitev deliti v vsakem logičnem rezu transakcije. Če ne želite, da je e-poštna komponenta globalni singleton, jo lahko nastavite takole.
Dodajanje registracij v življenjski obseg
Autofac ti omogoča, da dodaš "sproti" pri ustvarjanju življenjskega cikla. To vam lahko pomaga, ko potrebujete nekakšen "točkovno varjenje" omejenega registracijskega preglasitve ali če običajno potrebujete nekaj dodatnega v daljnogledu, ki ga ne želite registrirati globalno. To storite tako, da posredujete lambda datoteko BeginLifetimeScope(), ki vzame ContainerBuilder in doda registracije. (Pri ustvarjanju življenjskega cikla registrirajte dodatne storitve brez globalne registracije)
Obseg primerka
Obseg primerka določa, kako se instanca deli med zahtevami. Pri zahtevi storitve lahko autofac vrne en obseg posamezne instance, novo instanco za vsak obseg odvisnosti ali enojno v kontekstu, kot je nit ali HTTP zahteva za vsak življenjski obseg. To velja za primere, vrnjene iz eksplicitnega klica Resolve(), kot tudi za primere, ustvarjene interno v vsebniku za zadovoljevanje odvisnosti druge komponente.
- Primer na odvisnost
- Posamezna instanca
- Obseg primerkov na življenjsko dobo
- Življenjski obseg primera na ujemanje
- Instanca na zahtevo
- Primerek na lastništvo
- Obseg niti
Primer na odvisnost
V drugih kontejnerjih imenovan tudi transient' ali 'tovarniški', vsakič, ko je zahtevana storitev, vrne edinstveno instanco. Če ni določenega življenjskega cikla, je to privzeto vedenje.
Vsaka odvisnost Resolve vrne novo komponento.
Posamezna instanca
Ista instanca se vrne na vseh zahtevah in gnezdenih obsegih.
Obseg primerkov na življenjsko dobo
Ta scope se lahko uporabi za gnezdene scope. Komponenta obsega na življenjsko dobo ima največ eno instanco znotraj gnezdenega obsega. To je uporabno za objekte, specifične za eno enoto dela, ki morda potrebujejo dodatne logične enote dela. Vsak gnezdeni življenjski obseg dobi novo instanco registrirane odvisnosti.
Ko analizirate komponento primera za celotno življenjsko dobo, je v vsakem gnezdenem obsegu le ena instanca (npr. na enoto dela).
Življenjski obseg primera na ujemanje
To je podobno kot Instance Per Lifetime Scope, vendar je nadzor mogoče deliti z bolj natančnimi instancami. Ko ustvarite gnezdeni življenjski cikel, ga lahko označite ali poimenujete. Komponenta z obsegom na ujemanje življenjske dobe bo imela največ en primer na gnezdeni življenjski obseg, ki ustreza določenemu imenu. To omogoča ustvarjanje scoped singletonov, kjer lahko gnezdeni cikli delijo komponente brez ustvarjanja globalnih instanc.
Uporabno za posamezne enote dela, kot so http zahteve, ustvarjene kot gnezdeni življenjski cikli. Če je za HTTP zahtevo ustvarjena gnezdena življenjska doba, bo vsaka komponenta s posameznim življenjskim obsegom imela instanco za vsak HTTP zahtevek. (Več o življenjskem obsegu na zahtevo spodaj.)
V večini aplikacij je za predstavitev enote dela potrebna le ena hierarhična gnezdenost kontejnerjev. Če je potrebnih več gnezdenih ravni (npr. globalna >zahteva->transakcija), je mogoče ustvariti komponente, ki jih delijo na določeni ravni preko oznak.
Ko se začne gnezdeni življenjski cikel, so oznake povezane s tem življenjskim ciklom. Izjemo boste dobili, če boste poskušali rešiti komponento za posamezno ujemanje življenjskega obsega, če ni pravilno poimenovanega življenjskega obsega. (Če je življenjski cikel neshranjene oznake razčlenjen, pride do izjeme.)
Instanca na zahtevo
Nekatere vrste aplikacij imajo naravno semantiko tipa "request", na primer ASP.NET MVC. Med temi vrstami aplikacij je koristno imeti neko obliko "enojnega na zahtevo". Instanca na zahtevo se gradi na primerki po ustreznem življenjskem obsegu z zagotavljanjem znane oznake življenjskega obsega, metode za udobje registracije in integracije za običajne aplikacije Tipi (ena instanca na zahtevo je zgrajena na vrhu območja življenjske dobe za vsako ujemajočo se z dobro znano oznako življenjske dobe, metodo za udobje registracije in integracijo za pogoste vrste aplikacij). V bistvu gre za posamezno ujemajoče se življenjsko razmerje.
To pomeni, da če trenutno ni zahteve in razčlenjujete komponento, registrirano na podlagi primera na zahtevo, bo vržena izjema. Na voljo je podroben FAQ, ki opisuje, kako delati z življenjskimi dobami na posamezno zahtevo.
Prijava do hiperpovezave je vidna.
Primerek na lastništvo
Lastni implicitni tip odnosa, ki ustvarja nov gnezdeni življenjski cikel. Odvisnosti je mogoče omejiti na gostiteljsko instanco z registracijo z instanco na lastništvo.
V tem primeru bo storitev ServiceForHandler omejena na življenjsko dobo lastne instance MessageHandler.
Obseg niti
Lahko se sklicujete nanjo
Prijava do hiperpovezave je vidna.
Dejanski boj
Uporabljam način Instance Per Lifetime Scope.
V Winform se ob izvedbi klica vsakič uporabi kontekst baze podatkov, kot je prikazano na spodnji sliki:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 V primeru večnitnosti in sočasnosti, če uporabljate isti kontekst baze, boste naleteli na izjeme pri dodajanju, brisanju, spreminjanju ali preverjanju baze.
Želim, da mi Autofac vrne nov objekt vsakič, ko kliknem gumb, koda je naslednja:
Kot je prikazano spodaj:
(Konec) |