Hyvä artikkeli oppia Autofacin ohjauslaajuudesta ja elinkaaresta, elinkaaren laajuus vastaa yhtä työyksikköä sovelluksessasi, työyksikkö aloittaa elinkaaren laajuuden alusta, ja sitten palvelut, jotka vaativat kyseisen työyksikön, jäsennellään elinkaaren laajuudesta.
Elinikäiset kaukoputket
Luo Lifetme-kaukoputket
Luo tähtäin manuaalisesti ja hävitä. Elinikäiset tähtäimet ovat kertakäyttöisiä ja ne seuraavat komponenttien hävittämistä, joten varmista, että soitat aina "Dispose()" tai käärit ne "usein"-lauseisiin.
Etiketin elinikäiset tähtäimet
Joskus saatat joutua jakamaan joitakin palveluita työyksikön sisällä, mutta et halua käyttää globaaleja jakamismukavuuksia, kuten singleton-tilaa. Esimerkiksi web-sovelluksen pyyntökohtainen elinkaari, jolloin voit käyttää InstancePerMatchingLifetimeScopea elinkaarisi ja palvelusi tunnistamiseen.
Esimerkiksi on komponentti, joka lähettää sähköpostia, ja transaktiologiikan täytyy lähettää viestejä useita kertoja, jotta sähköpostipalvelu voidaan jakaa jokaisessa loogisessa transaktioviipaleessa. Jos et halua, että sähköpostikomponentti on globaali singleton, voit asettaa sen seuraavasti.
Rekisteröintien lisääminen elinikäiseen toimintaan
Autofac mahdollistaa "lennossa" lisäämisen elinkaaren luomisessa. Tämä voi auttaa, kun tarvitset eräänlaisen "pistehitsauksen" rajoitetun rekisteröinnin ohituksen, tai jos tarvitset vain lisälaitteita kaukoputkeen, jota et halua rekisteröidä maailmanlaajuisesti. Tämä tehdään siirtämällä lambda BeginLifetimeScope():lle, joka ottaa ContainerBuilderin ja lisää rekisteröinnit. (Elinkaaria luotaessa rekisteröi lisäpalveluita ilman globaalia rekisteröintiä)
Instanssilaajuus
Instanssilaajuus määrittää, miten instanssi jaetaan pyyntöjen kesken. Palvelua pyydettäessä autofac voi palauttaa yksittäisen instanssin scopen, uuden instanssin riippuvuusaluetta kohden tai yksittäisen kohteen kontekstissa, kuten säikeen tai HTTP-pyynnön per elinikäinen scope. Tämä koskee sekä instansseja, jotka palautetaan eksplisiittisestä Resolve()-kutsusta, että kontin sisäisesti luomiin instansseihin toisen komponentin riippuvuuksien tyydyttämiseksi.
- Instanssi riippuvuutta kohtaan
- Yksittäinen instanssi
- Instanssi per elinikäinen laajuus
- Instanssikohtainen elinikäinen laajuus
- Instanssi per pyyntö
- Instanssi omistettua kohtaan
- Säikeen laajuus
Instanssi riippuvuutta kohtaan
Muita kontteja kutsutaan myös transientiksi tai 'tehtaaksi', ja se palauttaa ainutlaatuisen instanssin aina, kun palvelua pyydetään. Jos elinkaaria ei ole määritelty, tämä on oletuskäyttäytyminen.
Jokainen Resolve-riippuvuus palauttaa uuden komponentin.
Yksittäinen instanssi
Sama instanssi palautetaan kaikissa pyynnöissä ja sisäkkäisissä scope-alueissa.
Instanssi per elinikäinen laajuus
Tätä laajuutta voidaan soveltaa sisäkkäisiin tähtäimiin. Per elinikäinen scope-komponentti sisältää enintään yhden instanssin sisäkkäisessä scopessa. Tämä on hyödyllistä yksittäiselle työyksikölle spesifisille objekteille, jotka saattavat tarvita lisäluonnollisia loogisia työyksiköitä. Jokainen sisäkkäinen elinikäinen skooppi saa uuden instanssin rekisteröidystä riippuvuudesta.
Kun jäsennät per lifetime scope -instanssikomponentin, jokaisessa sisäkkäisessä laajuudessa on vain yksi instanssi (esim. per työyksikkö).
Instanssikohtainen elinikäinen laajuus
Tämä on samankaltaista kuin Instance Per Lifetime Scope, mutta ohjaus voidaan jakaa tarkemmilla instansseilla. Kun luot sisäkkäisen elinkaaren, voit merkitä sen tai antaa sille nimen. Komponentilla, jonka elinikäinen laajuus on sovitus, on korkeintaan yksi instanssi sisäkkäistä elinikää kohden, joka vastaa annettua nimeä。 Tämä mahdollistaa scoped-singletonien luomisen, joissa sisäkkäiset syklit voivat jakaa komponentteja ilman globaaleja instansseja.
Hyödyllinen yksittäisille työyksiköille, kuten http-pyynnöille, jotka on luotu sisäkkäisinä elinkaarina. Jos sisäkkäinen elinikä luodaan per HTTP-pyyntö, jokaisella komponentilla, jolla on elinikäkohtainen laajuus, on instanssi per HTTP-pyyntö. (Lisää pyyntökohtaisesta elinikäisestä laajuudesta alla.)
Useimmissa sovelluksissa tarvitaan vain yksi hierarkkinen säiliön sisäkkäisyys kuvaamaan työyksikköä. Jos tarvitaan useita sisäkkäisiä tasoja (esim. globaali->pyyntö->transaktio), komponentteja voidaan luoda jaettavaksi tietyllä tasolla tunnisteiden avulla.
Kun sisäkkäinen elinkaari käynnistyy, tunnisteet liittyvät siihen elinkaareen. Saat poikkeuksen, jos yrität ratkaista per matching-lifetime-scope -komponentin, jossa ei ole oikein nimettyä elinikäistä scopea. (Jos tallentamattoman tunnisteen elinkaari jäsennellään, poikkeus tapahtuu.)
Instanssi per pyyntö
Joillakin sovellustyypeillä on luonnostaan "pyyntö"-tyyppinen semantiikka, kuten ASP.NET MVC. Näistä sovellustyypeistä on hyödyllistä, että on jonkinlainen "singleton per request" -järjestelmä. Instanssi per request rakentuu instanssikohtaisen elinikäisen laajuuden päälle tarjoamalla tunnetun elinikäisen laajuuden tunnisteen, rekisteröinnin helppousmenetelmän ja integraation yleiseen sovellukseen tyypit (yksi instanssi per pyyntö rakennetaan per matching lifetime -laajuuden päälle tarjoamalla tunnettu elinikätunniste, rekisteröinnin helppousmenetelmä ja integraatio yleisille sovellustyypeille). Periaatteessa se on vastaavuuden elinikäinen laajuus.
Tämä tarkoittaa, että jos voimassa olevaa pyyntöä ei ole ja jäsennät komponentin rekisteröitynä instanssikohtaisen pyynnön perusteella, poikkeus heitetään pois. On yksityiskohtainen UKK, jossa kerrotaan, miten työskentely perustuu pyyntökohtaisiin elinkaariin.
Hyperlinkin kirjautuminen on näkyvissä.
Instanssi omistettua kohtaan
Omistettu implisiittinen suhdetyyppi, joka luo uuden sisäkkäisen elinkaaren. Riippuvuudet voidaan rajoittaa isäntäinstanssiin rekisteröitymällä instanssi-per-owned -instanssiin.
Tässä esimerkissä ServiceForHandler-palvelu määritellään omistetun MessageHandler-instanssin elinkaaren mukaan.
Säikeen laajuus
Voit viitata siihen
Hyperlinkin kirjautuminen on näkyvissä.
Varsinainen taistelu
Käytän Instance Per Lifetime Scope -tilaa.
winformissa, kun kutsu suoritetaan, se käyttää joka kerta tietokantakontekstia, kuten alla olevassa kuvassa näkyy:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Monisäikeisyyden ja samanaikaisuuden tapauksessa, jos käytät samaa tietokantakontekstia, kohtaat poikkeuksia tietokannan lisäämisessä, poistamisessa, muokkaamisessa tai tarkistamisessa.
Haluan, että autofac palauttaa uuden objektin joka kerta kun painan painiketta, koodi on seuraava:
Kuten alla on esitetty:
(Loppu) |