Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 24701|Odpověď: 1

[Zdroj] Autofac řídí rozsah a životnost

[Kopírovat odkaz]
Zveřejněno 19. 9. 2020 12:51:52 | | | |
Dobrý článek pro seznámení se s rozsahem řízení a životním cyklem Autofacu je, že rozsah životního cyklu je ekvivalentní jednotce práce ve vaší aplikaci, jednotka práce začne rozsah životního cyklu na začátku a pak jsou služby, které tuto jednotku práce vyžadují, odděleny od rozsahu životního cyklu.

Celoživotní zaměřovače

Vytvořte Lifetme Scopes

Vytvořte si zaměřovač ručně a Likvidujte. Celoživotní scopes jsou jednorázové a sledují likvidaci komponent, takže vždy volejte "Dispose()" nebo je zabalte do příkazů "using".




Rozsah životního cyklu vydavatelství

Někdy možná budete muset sdílet některé služby v rámci jednotky práce, ale nechcete využívat globální pohodlí sdílení, jako je režim singleton. Například životní cyklus na požadavek webové aplikace, v takovém případě můžete použít InstancePerMatchingLifetimeScope k identifikaci svého životního cyklu a služby.

Například existuje komponenta, která odesílá poštu, a transakční logika musí posílat zprávy opakovaně, aby mohla být poštovní služba sdílena v každém logickém transakčním řezu. Pokud nechcete, aby e-mailová složka byla globální singleton, můžete ji nastavit následovně.



Přidání registrací do celoživotního rozsahu

Autofac umožňuje přidat "za pochodu" při vytváření životního cyklu. To vám pomůže, když potřebujete udělat jakýsi "bodový svař" omezené registrační přepsání, nebo pokud obecně potřebujete nějaké další věci v dalekohledu, které nechcete registrovat globálně. Děláte to tak, že předáte lambda do BeginLifetimeScope(), která vezme ContainerBuilder a přidá registrace. (Při vytváření životního cyklu registrujte další služby bez globální registrace)



Rozsah instance

Rozsah instance určuje, jak je instance sdílena mezi požadavky. Při žádosti o službu může autofac vrátit rozsah jedné instance, novou instanci pro každý rozsah závislostí nebo singleton v kontextu, například vlákno nebo HTTP požadavek pro celý životnostní rozsah. To platí pro instance vrácené z explicitního volání Resolve() i instance vytvořené interně kontejnerem, aby vyhověly závislosti jiné komponenty.

  • Instance na závislost
  • Jediná instance
  • Rozsah instance za životnost
  • Rozsah životnosti instance na párování
  • Instance na požadavek
  • Instance na vlastněné
  • Rozsah vlákna


Instance na závislost

V jiných kontejnerech se také nazývá transient' nebo 'factory', vrací unikátní instanci pokaždé, když je požadována služba. Pokud není specifikován žádný životní cyklus, toto je výchozí chování.



Každá závislost Resolve vrací novou komponentu.



Jediná instance

Stejná instance se vrací napříč všemi požadavky a vnořenými rozsahy.




Rozsah instance za životnost

Tento rozsah lze aplikovat na vnořené rozsahy. Komponenta rozsahu za celou dobu života má maximálně jednu instanci v rámci vnořeného rozsahu. To je užitečné pro objekty specifické pro jednu jednotku práce, které mohou potřebovat vnoření dalších logických jednotek práce. Každý vnořený celoživotní rozsah získá novou instanci registrované závislosti.



Když analyzujete komponentu instance pro jednotlivé životnosti, je v každém vnořeném rozsahu pouze jedna instance (například na jednotku práce).


Rozsah životnosti instance na párování

To je podobné jako Instance Per Lifetime Scope, ale řízení lze sdílet s přesnějšími instancemi. Když vytvoříte vnořený životní cyklus, můžete ho označit nebo pojmenovat. Komponenta s rozsahem na dobu života na párování bude mít nejvýše jednu instanci na vnořený rozsah života, která odpovídá danému jménu。 To umožňuje vytváření scoped singletonů, kde vnořené cykly mohou sdílet komponenty bez vytváření globálních instancí.

Užitečné pro jednotlivé jednotky práce, jako jsou HTTP požadavky, vytvořené jako vnořené životní cykly. Pokud je vnořená doba života vytvořena pro každý HTTP požadavek, pak každá komponenta s rozsahem na životnost bude mít instanci na každý HTTP požadavek. (Více o rozsahu života na žádost níže.)

Ve většině aplikací je k reprezentaci jednotky práce potřeba pouze jedno hierarchické vnoření kontejnerů. Pokud je potřeba více vnořených úrovní (např. globální >požadavek >transakce), lze vytvořit komponenty, které budou sdíleny na konkrétní úrovni pomocí značek.



Když je zahájen vnořený životní cyklus, tagy jsou s tímto cyklem spojeny. Výjimku dostanete, pokud se pokusíte vyřešit komponentu s rozsahem života na jednotlivé shody, když neexistuje správně pojmenovaný rozsah života. (Pokud je životní cyklus neuloženého tagu parsován, nastane výjimka.)



Instance na požadavek

Některé typy aplikací mají přirozeně sémantiku typu "požadavek", například ASP.NET MVC. Mezi těmito typy aplikací je užitečné mít nějakou formu "singleton na požadavek". Instance na požadavek se staví na úrovni odpovídající životní rozsahu tím, že poskytuje dobře známý lifetime scope tag, metodu pro pohodlí registrace a integraci pro běžné aplikace Typy (jedna instance na požadavek je postavena na základě rozsahu života pro odpovídající požadavek poskytováním dobře známého životního tagu, metody pohodlí registrace a integrací pro běžné typy aplikací). V podstatě jde o životní rozsah podle shody.

To znamená, že pokud aktuálně není žádný požadavek a vy analyzujete komponentu registrovanou na základě instance-per-request, bude vyhozena výjimka. Je zde podrobné FAQ, které popisuje, jak pracovat s životností na požadavek.

Přihlášení k hypertextovému odkazu je viditelné.



Instance na vlastněné

Vlastněný implicitní typ vztahu, vytváření nového vnořeného životního cyklu. Závislosti lze omezit na hostitelskou instanci registrací s instancí na vlastněnou instanci.



V tomto příkladu bude služba ServiceForHandler omezena na životnost vlastněné instance MessageHandler.



Rozsah vlákna

Můžete se na něj odkazovat

Přihlášení k hypertextovému odkazu je viditelné.

Skutečný boj

Používám režim Instance Per Lifetime Scope.

Ve Winform, když je volání vykonáno, používá databázový kontext pokaždé, jak je znázorněno na obrázku níže:



_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655

V případě vícevláknového a souběžnosti, pokud použijete stejný kontext databáze, narazíte na výjimky při přidávání, mazání, úpravě nebo kontrole databáze.

Chci, aby autofac vracel nový objekt pokaždé, když kliknu na tlačítko, kód je následující:


Jak je uvedeno níže:



(Konec)




Předchozí:.NET/C# Text s vodoznakem pro dlaždicování obrázků
Další:ASP.NET Zakázat přístup k logovacím souborům ve formě URL adres
Zveřejněno 8. 9. 2022 09:58:24 |
Přesně to potřebujeme
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com