Dobrý článok na naučenie sa o rozsahu a životnom cykle Autofacu je, že rozsah životného cyklu je ekvivalentný jednotke práce vo vašej aplikácii, jednotka práce začne rozsah životného cyklu na začiatku a potom služby, ktoré túto jednotku práce vyžadujú, sú oddelené od rozsahu životného cyklu.
Celoživotné zameriavače
Vytvorte Lifetme Scopes
Vytvor si zameriavač manuálne a Zlikviduj. Celoživotné mikroskopy sú jednorazové a sledujú likvidáciu komponentov, takže vždy volajte "Dispose()" alebo ich zabalte do príkazov "používajúc".
Rozsah životnosti vydavateľstva
Niekedy možno budete musieť zdieľať niektoré služby v rámci jednotky práce, ale nechcete využívať globálne zdieľanie, ako je režim singleton. Napríklad životný cyklus na požiadavku webovej aplikácie, v takom prípade môžete použiť InstancePerMatchingLifetimeScope na identifikáciu svojho životného cyklu a služby.
Napríklad existuje komponent, ktorý odosiela poštu, a transakčná logika musí posielať správy viackrát, aby mohla byť poštová služba zdieľaná v každom logickom úseku transakcie. Ak nechcete, aby e-mailová zložka bola globálnym singletonom, môžete ju nastaviť nasledovne.
Pridávanie registrácií do celoživotného rozsahu
Autofac vám umožňuje pridať "za pochodu" pri vytváraní životného cyklu. To vám môže pomôcť, keď potrebujete urobiť akýsi "bodový zvárač" – obmedzené prepísanie registrácie alebo ak potrebujete len niečo navyše v ďalekohľade, ktorý nechcete registrovať globálne. Robíte to tak, že posielate lambda do BeginLifetimeScope(), ktorý vezme ContainerBuilder a pridá registrácie. (Pri vytváraní životného cyklu registrujte ďalšie služby bez globálnej registrácie)
Rozsah inštancie
Rozsah inštancie určuje, ako sa inštancia zdieľa medzi požiadavkami. Pri požiadavke na službu môže autofac vrátiť rozsah jednej inštancie, novú inštanciu pre každý rozsah závislostí alebo singleton v kontexte, napríklad vlákno alebo HTTP požiadavku pre celý životný rozsah. Toto platí pre inštancie vrátené z explicitného volania Resolve(), ako aj pre inštancie vytvorené interne kontajnerom na uspokojenie závislostí inej komponenty.
- Inštancia na závislosť
- Jediná inštancia
- Rozsah inštancií za životnosť
- Rozsah životnosti inštancie na párovanie
- Inštancia na požiadavku
- Inštancia na vlastnené
- Thread Scope
Inštancia na závislosť
V iných kontajneroch sa tiež nazýva transient' alebo 'factory', pričom pri každej požiadavke na službu vracia jedinečnú inštanciu. Ak nie je špecifikovaný žiadny životný cyklus, toto je predvolené správanie.
Každá závislosť Resolve vráti novú komponentu.
Jediná inštancia
Rovnaká inštancia sa vracia naprieč všetkými požiadavkami a vnorenými rozsahmi.
Rozsah inštancií za životnosť
Tento rozsah možno aplikovať na vnorené rozsahy. Komponent rozsahu na životnosť má maximálne jednu inštanciu v rámci vnoreného rozsahu. To je užitočné pre objekty špecifické pre jednu jednotku práce, ktoré môžu potrebovať vnoriť ďalšie logické jednotky práce. Každý vnorený celoživotný rozsah dostane novú inštanciu registrovanej závislosti.
Keď analyzujete komponent inštancie pre jednotlivé životnosti, v každom vnorenom rozsahu je len jedna inštancia (napr. za jednotku práce).
Rozsah životnosti inštancie na párovanie
Je to podobné ako Instance Per Lifetime Scope, ale ovládanie je možné zdieľať s presnejšími inštanciami. Keď vytvoríte vnorený životný cyklus, môžete ho označiť alebo mu dať meno. Komponent s rozsahom na zladenie počas života bude mať najviac jednu inštanciu na vnorený rozsah života, ktorý zodpovedá danému názvu. To umožňuje vytváranie scoped singletonov, kde vnorené cykly môžu zdieľať komponenty bez vytvárania globálnych inštancií.
Užitočné pre jednotlivé jednotky práce, ako sú HTTP požiadavky, vytvorené ako vnorené životné cykly. Ak sa vnorený životný cyklus vytvorí pre každý HTTP požiadavok, potom každá komponenta s rozsahom na životnosť bude mať inštanciu na každý HTTP požiadavku. (Viac o životnom rozsahu na požiadanie nižšie.)
Vo väčšine aplikácií je na reprezentáciu jednotky práce potrebný len jeden hierarchický vnorený kontajner. Ak je potrebných viacero vnorených úrovní (napr. globálna >požiadavka->transakcia), je možné vytvoriť komponenty na zdieľanie na konkrétnej úrovni pomocou značiek.
Keď sa spustí vnorený životný cyklus, tagy sú s týmto životným cyklom priradené. Výnimku dostanete, ak sa pokúsite vyriešiť komponent s každým matching-lifetime-scope, keď neexistuje správne pomenovaný lifetime scope. (Ak je životný cyklus neuloženého tagu parsovaný, nastane výnimka.)
Inštancia na požiadavku
Niektoré typy aplikácií prirodzene majú sémantiku typu "požiadavka", napríklad ASP.NET MVC. Pri týchto typoch aplikácií je užitočné mať nejakú formu "singleton na požiadavku". Inštancia na požiadavku nadväzuje na inštanciu podľa zodpovedajúceho rozsahu životnosti tým, že poskytuje známy lifetime scope tag, metódu pohodlnosti registrácie a integráciu pre bežné aplikácie Typy (jedna inštancia na požiadavku sa stavia na rámec zodpovedajúcej životnosti poskytovaním známeho lifetime tagu, metódy pohodlia registrácie a integrácie pre bežné typy aplikácií). V podstate ide o zodpovedajúcu životnosť rozsahu.
To znamená, že ak aktuálna požiadavka nie je a komponent sa zaregistruje na základe inštancie na požiadavku, bude vyhodená výnimka. Je tu podrobné FAQ, ktoré popisuje, ako pracovať s životnosťou na jednu požiadavku.
Prihlásenie na hypertextový odkaz je viditeľné.
Inštancia na vlastnené
Vlastnený implicitný typ vzťahu, vytvárajúci nový vnorený životný cyklus. Závislosti môžu byť obmedzené na hostiteľskú inštanciu registráciou s inštanciou na vlastnenie.
V tomto príklade bude služba ServiceForHandler obmedzená na životnosť vlastnenej inštancie MessageHandler.
Thread Scope
Môžeš sa naň odvolať
Prihlásenie na hypertextový odkaz je viditeľné.
Skutočný boj
Používam režim Example Per Lifetime Scope.
Vo winforme, keď sa hovor vykoná, používa databázový kontext zakaždým, ako je znázornené na obrázku nižšie:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 V prípade viacvláknového spracovania a súbežnosti, ak používate rovnaký kontext databázy, narazíte na výnimky pri pridávaní, mazaní, úprave alebo kontrole databázy.
Chcem, aby autofac vracal nový objekt zakaždým, keď kliknem na tlačidlo, kód je nasledovný:
Ako je uvedené nižšie:
(Koniec) |