Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 24701|Risposta: 1

[Fonte] Autofac controlla la portata e la durata della vita

[Copiato link]
Pubblicato il 19-09-2020 12:51:52 | | | |
Un buon articolo per imparare sull'ambito e il ciclo di vita del controllo Autofac: l'ambito del ciclo di vita è equivalente a un'unità di lavoro nella tua applicazione, un'unità di lavoro inizierà l'ambito del ciclo di vita all'inizio, e poi i servizi che richiedono quell'unità di lavoro vengono estratti dall'ambito del ciclo di vita.

Scope a vita

Crea ambiti Lifetme

Crea un telescopio manualmente e Smalti. I scope a vita sono usa e getta e tracciano lo smaltimento dei componenti, quindi assicurati sempre di chiamare "Dispose()" o di avvolgerli in istruzioni "using".




Scopi di Vita dell'Etichetta

A volte potresti dover condividere alcuni servizi all'interno di un'unità di lavoro, ma non vuoi usare comodità di condivisione globale, come la modalità singleton. Ad esempio, il ciclo di vita per richiesta di un'applicazione web, nel qual caso puoi usare InstancePerMatchingLifetimeScope per identificare il tuo ciclo di vita e il servizio.

Ad esempio, c'è un componente che invia la posta e la logica delle transazioni deve inviare messaggi più volte, così il servizio di posta può essere condiviso in ogni fetta di transazione logica. Se non vuoi che la componente email sia un singleton globale, puoi impostarla come segue.



Aggiungere le registrazioni a un ambito a vita

Autofac ti permette di aggiungere "al volo" quando crei un ciclo di vita. Questo può aiutarti quando devi fare una sorta di override limitato di registrazione "a punte" o se in generale hai bisogno di qualche elemento aggiuntivo in un ambito che non vuoi registrare a livello globale. Lo fai passando un lambda a BeginLifetimeScope() che prende un ContainerBuilder e aggiunge registrazioni. (Quando si crea un ciclo di vita, registra servizi aggiuntivi senza registrazione globale)



Ambito dell'Istanza

L'ambito dell'istanza determina come un'istanza viene condivisa tra le richieste. Quando si richiede un servizio, autofac può restituire un singolo scope di istanza, una nuova istanza per ogni ambito di dipendenza, o un singleton in un contesto, come un thread o una richiesta HTTP per ambito di vita. Questo vale sia per istanze restituite da una chiamata esplicita Resolve() sia per istanze create internamente dal contenitore per soddisfare le dipendenze di un altro componente.

  • Istanza per dipendenza
  • Istanza singola
  • Istanza per ambito di vita
  • Istanza per ambito corrispondente a vita
  • Istanza per Richiesta
  • Istanza per Proprietà
  • Ambito del thread


Istanza per dipendenza

Chiamata anche 'transiente' o 'factory' in altri container, restituisce un'istanza unica ogni volta che viene richiesto un servizio. Se non è specificato un ciclo di vita, questo è il comportamento predefinito.



Ogni dipendenza Resolve restituisce un nuovo componente.



Istanza singola

La stessa istanza viene restituita su tutte le richieste e gli scope annidati.




Istanza per ambito di vita

Questo ambito può essere applicato a scope annidati. La componente per durata di tempo ha al massimo un'istanza all'interno dell'ambito annidato. Questo è utile per oggetti specifici di una singola unità di lavoro che potrebbero aver bisogno di annidare ulteriori unità logiche di lavoro. Ogni ambito di vita annidata riceverà una nuova istanza della dipendenza registrata.



Quando analizzi la componente di istanza per scalo di vita, c'è solo un'istanza in ogni ambito annidato (ad esempio per unità di lavoro).


Istanza per ambito corrispondente a vita

Questo è simile all'Instance Per Lifetime Scope, ma il controllo può essere condiviso con istanze più precise. Quando crei un ciclo di vita annidato, puoi etichettarlo o dargli un nome. Un componente con ambito per lifetime abbinamento avrà al massimo un'istanza singola per ambito annidato che corrisponde a un nome proprio. Ciò consente la creazione di singleton con ambito, dove i cicli annidati possono condividere componenti senza creare istanze globali.

Utile per singole unità di lavoro, come le richieste http, create come cicli di vita annidati. Se viene creata una durata annidata per richiesta HTTP, allora qualsiasi componente con ambito per vita avrà un'istanza per ogni richiesta HTTP. (Maggiori dettagli sull'ambito della durata per richiesta qui sotto.)

Nella maggior parte delle applicazioni, è necessario un solo contenitore gerarchico per rappresentare un'unità di lavoro. Se sono necessari più livelli annidati (ad esempio, global->richiesta->transazione), possono essere creati componenti per essere condivisi a un livello specifico tramite tag.



Quando si avvia un ciclo di vita annidato, i tag sono associati a quel ciclo. Otterrai un'eccezione se provi a risolvere un componente per ambito di vita abbinato quando non esiste un ambito di vita correttamente denominato. (Se il ciclo di vita del tag non salvato viene analizzato, si verificherà un'eccezione.)



Istanza per Richiesta

Alcuni tipi di applicazioni hanno naturalmente una semantica di tipo "richiesta", come ASP.NET MVC. Tra questi tipi di domanda, è utile avere una sorta di "singleton per richiesta". Istanza per richiesta si costruisce sopra ogni istanza per ambito corrispondente a vita fornendo un noto tag per ambito a vita, un metodo di praticità di registrazione e integrazione per applicazioni comuni tipi (un'istanza per richiesta viene costruita sopra l'ambito di vita corrispondente fornendo un tag di vita ben noto, un metodo di comodità di registrazione e integrazione per tipi di applicazioni comuni). In sostanza, è per ambito di corrispondenza a durata di vita.

Questo significa che se non c'è una richiesta attuale e analizzi un componente registrato in base a istagna per richiesta, verrà lanciata un'eccezione. C'è una FAQ dettagliata che spiega come lavorare con la durata per richiesta.

Il login del link ipertestuale è visibile.



Istanza per Proprietà

Possedere il tipo di relazione implicita, creando un nuovo ciclo di vita annidato. Le dipendenze possono essere limitate all'istanza host registrandosi con instance-per-owned.



In questo esempio, il servizio ServiceForHandler sarà scalizzato alla durata dell'istanza MessageHandler di proprietà.



Ambito del thread

Puoi consultarla

Il login del link ipertestuale è visibile.

Combattimento vero e proprio

Sto usando la modalità Istanza Per Scopo di Vita.

In winform, quando la chiamata viene eseguita, viene utilizzato ogni volta un contesto di database, come mostrato nella figura sottostante:



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

Nel caso del multithreading e della concorrenza, se usi lo stesso contesto del database, incontrerai eccezioni quando aggiungi, cancelli, modifichi o controlli del database.

Voglio che l'autofac restituisca un nuovo oggetto ogni volta che clicco sul pulsante, il codice è il seguente:


Come mostrato di seguito:



(Fine)




Precedente:.NET/C# Testo con filigrana per le immagini di tiling
Prossimo:ASP.NET Vieta l'accesso ai file di log sotto forma di URL
Pubblicato il 8-09-2022 09:58:24 |
Esattamente ciò di cui abbiamo bisogno
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com