Un articol bun pentru a învăța despre domeniul și ciclul de viață al controlului Autofac: scopul ciclului de viață este echivalent cu o unitate de lucru în aplicația ta, o unitate de lucru va începe domeniul ciclului de viață de la început, iar apoi serviciile care necesită acea unitate de lucru sunt extrase din scopul ciclului de viață.
Lunete pe viață
Creează lunete de viață
Creează manual un telescop și elimină. Scopo-urile pe viață sunt de unică folosință și monitorizează eliminarea componentelor, așa că asigură-te că suni întotdeauna "Dispose()" sau le înfășori în instrucțiuni "using".
Scope pe durata vieții etichetei
Uneori este posibil să fie nevoie să partajezi unele servicii într-o unitate de lucru, dar nu vrei să folosești facilități globale de partajare, cum ar fi modul singleton. De exemplu, ciclul de viață pe cerere al unei aplicații web, caz în care poți folosi InstancePerMatchingLifetimeScope pentru a-ți identifica ciclul de viață și serviciul.
De exemplu, există o componentă care trimite email, iar logica tranzacțiilor trebuie să trimită mesaje de mai multe ori, astfel încât serviciul de mail poate fi partajat în fiecare felie logică de tranzacție. Dacă nu vrei ca componenta de email să fie un singleton global, o poți seta astfel.
Adăugarea înregistrărilor la un domeniu pe viață
Autofac îți permite să adaugi "în mers" când creezi un ciclu de viață. Acest lucru te poate ajuta atunci când trebuie să faci un fel de suprascriere limitată a înmatriculării "prin sudură punctuală" sau dacă, în general, ai nevoie doar de ceva suplimentar într-un telescop pe care nu vrei să-l înregistrezi global. Faci asta pasând un lambda către BeginLifetimeScope() care ia un ContainerBuilder și adaugă înregistrări. (La crearea unui ciclu de viață, înregistrați servicii suplimentare fără înregistrare globală)
Domeniul instanței
Domeniul instanței determină modul în care o instanță este partajată între cereri. Când se solicită un serviciu, autofac poate returna un singur scop de instanță, o nouă instanță pentru fiecare domeniu de dependență sau un singleton într-un context, cum ar fi un fir de execuție sau o cerere HTTP pe durata vieții. Aceasta se aplică instanțelor returnate dintr-un apel explicit Resolve(), precum și instanțelor create intern de container pentru a satisface dependențele altei componente.
- Instanță pe dependență
- Instanță unică
- Instanță pe sferă pe viață
- Instanță pe sfera de viață potrivită
- Instanță pe cerere
- Instanță pe proprietate
- Domeniul firului
Instanță pe dependență
Numită și "tranzientă" sau "fabrică" în alte containere, returnează o instanță unică de fiecare dată când este solicitată o serviciu. Dacă nu există un ciclu de viață specificat, acesta este comportamentul implicit.
Fiecare dependență Resolve returnează o componentă nouă.
Instanță unică
Aceeași instanță este returnată la toate cererile și scopurile imbricate.
Instanță pe sferă pe viață
Acest scop poate fi aplicat la telescopii imbricate. Componenta de scop pe durata vieții are maximum o instanță în cadrul scopului imbricat. Acest lucru este util pentru obiecte specifice unei singure unități de lucru care pot avea nevoie să includă unități logice suplimentare de lucru. Fiecare scop de viață imbricat va primi o nouă instanță a dependenței înregistrate.
Când analizezi componenta instanței pe durata vieții, există o singură instanță în fiecare scop imbricată (de exemplu, pe unitate de lucru).
Instanță pe sfera de viață potrivită
Aceasta este similară cu Instance Per Lifetime Scope, dar controlul poate fi împărțit cu instanțe mai precise. Când creezi un ciclu de viață imbricat, îl poți eticheta sau îi poți da un nume. O componentă cu scopscop pe viață de potrivire va avea cel mult o singură instanță pe scopscop de viață imbricată care corespunde unui nume dat. Acest lucru permite crearea singleton-urilor cu scop, unde ciclurile imbricate pot împărți componente fără a crea instanțe globale.
Util pentru unități individuale de lucru, cum ar fi cererile http, create ca cicluri de viață imbricate. Dacă se creează o durată de viață imbricată pentru fiecare cerere HTTP, atunci orice componentă cu scop pe viață va avea o instanță pentru fiecare cerere HTTP. (Mai multe detalii despre durata pe viață pe cerere mai jos.)
În majoritatea aplicațiilor, este necesară o singură imbarcare ierarhică a containerelor pentru a reprezenta o unitate de lucru. Dacă sunt necesare mai multe niveluri imbricate (de exemplu, global->cerere->tranzacție), pot fi create componente pentru a fi partajate la un anumit nivel prin intermediul etichetelor.
Când începe un ciclu de viață imbricat, etichetele sunt asociate cu acel ciclu de viață. Vei avea o excepție dacă încerci să rezolvi o componentă pe durata de viață pentru potrivire atunci când nu există un scop de viață denumit corect. (Dacă ciclul de viață al etichetei nesalvate este analizat, va apărea o excepție.)
Instanță pe cerere
Unele tipuri de aplicații au, în mod natural, o semantică de tip "cerere", cum ar fi ASP.NET MVC. Dintre aceste tipuri de aplicații, este util să existe o formă de "singleton per cerere". Instanță pe cerere se construiește peste instanță pe durata de viață corespunzătoare, oferind o etichetă binecunoscută pentru durata de viață, o metodă de conveniență pentru înregistrare și integrare pentru aplicații comune tipuri (o instanță per cerere este construită peste scopul pe viață pentru potrivire, oferind o etichetă pe viață bine cunoscută, o metodă de conveniență a înregistrării și integrare pentru tipuri comune de aplicații). Practic, este pe durata de viață potrivită.
Aceasta înseamnă că, dacă nu există o cerere curentă și analizezi o componentă înregistrată pe baza instanței pe cereri, va fi aruncată o excepție. Există un FAQ detaliat care explică cum să lucrezi cu durate de viață pe cerere.
Autentificarea cu hyperlink este vizibilă.
Instanță pe proprietate
Dețin tipul de relație implicită, creând un nou ciclu de viață imbricat. Dependențele pot fi limitate la instanța gazdă prin înregistrarea cu instanța per-owned.
În acest exemplu, serviciul ServiceForHandler va avea acoperire pe durata de viață a instanței MessageHandler deținute.
Domeniul firului
Poți să te referi la el
Autentificarea cu hyperlink este vizibilă.
Lupta propriu-zisă
Folosesc modul Instance Per Lifetime Scope.
În winform, când apelul este executat, se folosește un context de bază de date de fiecare dată, așa cum se arată în figura de mai jos:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 În cazul multi-threading-ului și concurenței, dacă folosești același context de baze de date, vei întâmpina excepții la adăugarea, ștergerea, modificarea sau verificarea bazei de date.
Vreau ca autofac să returneze un obiect nou de fiecare dată când apăs butonul, codul este următorul:
Așa cum se arată mai jos:
(Sfârșit) |