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) |