Jó cikk az Autofac vezérlési hatóköréről és életciklusáról, az életciklus hatóköre egy munkaegységnek felel meg az alkalmazásban, egy munkaegység az életciklus hatókörét az elején kezdi, majd azokat a szolgáltatásokat, amelyek ezt a munkaegységet igénylik, az életciklus hatóköréből válnak ki.
Élettartam távcsövek
Lifetme távcsövek létrehozása
Készíts el kézzel távcsövet és Disposal. Az élettartam távcsövek eldobhatóak, és nyomon követik az alkatrészek eltávolítását, ezért mindig hívd a "Dispose()"-ot, vagy csomagold be őket "using" utasításokba.
Kiadó élettartamú távcsövek
Néha előfordulhat, hogy bizonyos szolgáltatásokat meg kell osztanod egy munkaegységen belül, de nem érdemes globális megosztási lehetőségeket, például egy-egy módot használni. Például egy webalkalmazás kérésenkénti életciklusa, ebben az esetben az InstancePerMatchingLifetimeScope segítségével azonosíthatod az életciklusodat és a szolgáltatást.
Például van egy komponens, amely leveleket küld, és a tranzakciós logikának többször is üzeneteket kell küldenie, így a postai szolgáltatás minden logikai tranzakciós szeletben megosztható. Ha nem szeretnéd, hogy az e-mail komponens globális singleton legyen, beállíthatod az alábbiaknak.
Regisztrációk hozzáadása az élethosszig tartó hatókörbe
Az Autofac lehetővé teszi, hogy "menet közben" hozzáadj egy életciklus létrehozásához. Ez segíthet, amikor valamilyen "ponthegesztésre" van szükséged korlátozott regisztrációs felülbírálásra, vagy ha általában csak néhány plusz dologra van szükséged egy távcsőben, amit nem szeretnél globálisan regisztrálni. Ezt úgy éred el, hogy egy lambda-t továbbítasz a BeginLifetimeScope()-nak, amely egy ContainerBuilder-t vesz és regisztrált be. (Életciklus létrehozásakor regisztrálj további szolgáltatásokat globális regisztráció nélkül)
Instance Scope
A instance scope határozza meg, hogyan osztják meg egy példányt a kérések között. Szolgáltatáskéréskor az autofac egyetlen instance scope-t, egy új példányt a függőségi tartományban, vagy egy singletont egy kontextusban, például egy szálat vagy HTTP kérést életre szóló scope-enként. Ez vonatkozik olyan példányokra, amelyeket egy explicit Resolve() hívásból térnek vissza, valamint azokra a példányokra, amelyeket a konténer belső létrehozása hozott létre, hogy kielégítse egy másik komponens függőségét.
- Instance függőség szerint
- Egyetlen példány
- Instance per life scope
- Instance per matching élettartam hatókör
- Instance Per Request
- Példány tulajdonosonként
- Szál Távcsiba
Instance függőség szerint
Más konténerekben átmeneti vagy "gyár" néven is nevezik, minden alkalommal egyedi példányt ad vissza, amikor szolgáltatást kérnek. Ha nincs meghatározott életciklus, ez az alapértelmezett viselkedés.
Minden Resolve-függőség új komponenst ad vissza.
Egyetlen példány
Ugyanaz az instance jelenik meg minden kérésre és beágyazott scope-ra.
Instance per life scope
Ez a scope alkalmazható beágyazott távcsövekre. Az életre szóló scope komponensnek legfeljebb egy példánya van a beépített scope-ban. Ez hasznos olyan objektumok esetében, amelyek egy munkaegységhez specifikusak lehetnek, és további logikai munkaegységeket kell integrálniuk. Minden beágyazott élettartam szempla új példányt kap a regisztrált függőségből.
Amikor az életre szóló scope instance komponenst elemzi, minden beágyazott területben csak egy példány van (pl. munkaegységenként).
Instance per matching élettartam hatókör
Ez hasonló az Instance Per Lifetime Scope-hoz, de a vezérlés pontosabb példányokkal megosztható. Amikor beágyazott életciklust hozol létre, címkézheted vagy adhatod neki. Egy komponens, amelynek élettartam-alapú egysége egy beágyazott élettartam hatótávon legfeljebb egyetlen példányt tartalmaz, amely megfelel egy adott néven。 Ez lehetővé teszi a szkóposztolt singletonok létrehozását, ahol az ágyazott ciklusok megoszthatják a komponenseket anélkül, hogy globális példányokat hoznának létre.
Hasznos egyetlen munkaegységhez, például http kérésekhez, amelyeket beágyazott életciklusként hoznak létre. Ha egy HTTP kérésre beágyazott élettartamot hoznak létre, akkor bármely komponensnek, amelynek élettartam hatótávolsága van, HTTP kérésenként példányt kap. (Az alap a kérés szerinti élettartam lehetőségeiről bővebben.)
A legtöbb alkalmazásban csak egy hierarchikus konténer fészkelés szükséges egy munkaegység képviseléséhez. Ha több beágyazott szintre van szükség (pl. globális->request->tranzakció), akkor komponensek létrehozhatók, hogy egy adott szinten osztossanak meg címkék segítségével.
Amikor egy beágyazott életciklus indul, a címkék ehhez kapcsolódnak. Kivételt kapsz, ha megpróbálsz egy életre szóló hatótáv komponenst rendezni, ha nincs helyesen elnevezett élettartam-scope-. (Ha a mentetlen tag életciklusát feldolgozzák, kivétel következik be.)
Instance Per Request
Néhány alkalmazástípus természetesen "kérés" típusú szemantikával rendelkezik, például ASP.NET MVC. Ezek közül az alkalmazástípusok közül hasznos, ha van valamilyen "singleton per request" (egyéni kérés alapján). A kérésenkénti példány az illik élettartam hatótávra épül, egy jól ismert élettartam hatótáv címkével, regisztrációs kényelmi módszerrel és közös alkalmazás integrációjával típusok (egy példány kérésenként a megfelelő élettartam keretére épül egy jól ismert élettartam címkével, regisztrációs kényelmi módszerrel és integrálással a gyakori alkalmazástípusokhoz). Lényegében az élettartam szerinti méret alapján történik.
Ez azt jelenti, hogy ha nincs aktuális kérés, és egy komponenst példányonkénti kérelem alapján ekezzel elemezni, akkor kivétel kerül elő. Részletes GYIK is bemutatja, hogyan kell a kérés szerinti élettartamokkal dolgozni.
A hiperlink bejelentkezés látható.
Példány tulajdonosonként
Tulajdonolt implicit kapcsolattípus, ami új beágyazott életciklust teremt. A függőségek korlátozhatók a host példányra azzal, hogy regisztrálunk instance-per-owned példánynál.
Ebben a példában a ServiceForHandler szolgáltatás a tulajdonjogú MessageHandler példány élettartamára lesz kiterjedve.
Szál Távcsiba
Hivatkozhatsz rá
A hiperlink bejelentkezés látható.
Valódi harc
Én az Instance Per Lifetime Scope módot használom.
A winform-ban, amikor a hívást végrehajtják, minden alkalommal adatbázis-kontextust használ, ahogy az alábbi ábrán látható:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Többszálas és egyidejű esetén, ha ugyanazt a adatbázis kontextust használod, kivételekkel találkozhatsz az adatbázis hozzáadásakor, törlésekor, módosítása vagy ellenőrzése során.
Azt szeretném, ha az autofac minden gombnyomásnál új objektumot adna vissza, a kód a következő:
Ahogy az alábbiakban látható:
(Vége) |