Utilizzando EF per manipolare il database, estrarre il DbContext (classe di contesto operativo del database) nella stessa richiesta HTTP per garantire l'unicità, l'articolo utilizza due schemi per garantire l'unicità del contesto dell'Entity Framework, e la soluzione sulla piattaforma .NET Core è collegata.
Opzione 1
Se un oggetto è garantito come unico a livello globale, penserai sicuramente a un pattern di design classico: modalità singleton, se l'oggetto da usare deve essere unico nel thread?
Data Slot: CallContext, ok, vedi la spiegazione msdn sul callcontent.
CallContext è un oggetto di raccolta dedicato simile a uno store thread-locale per le chiamate al metodo, e fornisce uno slot dati unico per ogni thread di esecuzione logica. Gli slot dati non sono condivisi tra i contesti delle chiamate su altri thread logici. Gli oggetti possono essere aggiunti al CallContext quando questo si propaga avanti e indietro lungo il percorso del codice di esecuzione ed è ispezionato da singoli oggetti in quel percorso.
Cioè, il thread corrente memorizza l'oggetto nella memoria locale del thread, e l'oggetto viene distrutto man mano che il thread viene distrutto.
Usa il codice:
Scenari d'uso: personalmente penso che venga usato quando l'oggetto deve essere usato globalmente all'interno del thread, e gli altri thread di estensione del pacchetto thread non possono accedervi. Ad esempio, nel contesto dati di EF, verrà generato un thread per ogni richiesta e, in questo momento, verrà creato un oggetto contesto dati per diverse funzioni da utilizzare, che infine verrà effettuato un commit insieme per evitare problemi di transazione. Certo, alcune persone potrebbero chiedermi se posso creare una variabile da usare, che può anche raggiungere lo stesso scopo, ma questo oggetto può anche interagire con altri dati del thread, il che va contro il concetto di essere unico nel thread.
Opzione 2
Lo scenario si basa sulle richieste web http, perché ogni richiesta è un nuovo thread, e il codice è il seguente:
Utilizzo di "CallContext" in .NET Core
Sappiamo che CallContext non è più disponibile per . NETStandard o .NET Core.
Ma puoi usare Asynclocal<T> per imitare un CallContext, basta creare la seguente classe statica:
Namespace che devono essere consultati:
È anche facile da usare (qui ho inserito CallContext nella libreria Common):
|