Použitím EF na manipuláciu s databázou, extrahovanie DbContext (trieda kontextu operácie databázy) v tej istej HTTP požiadavke na zabezpečenie jedinečnosti, článok používa dve schémy na zabezpečenie jedinečnosti kontextu Entity Framework a riešenie na platforme .NET Core je pripojené.
Možnosť 1
Ak je objekt zaručene globálne jedinečný, určite si predstavíte klasický dizajnový vzor: singleton režim, ak musí byť použitý objekt jedinečný vo vlákne?
Dátový slot: CallContext, pozri vysvetlenie callcontentu na msdn.
CallContext je vyhradený objekt kolekcie podobný vláknovému lokálnemu úložisku pre volania metód a poskytuje dátový slot, ktorý je jedinečný pre každé logické vykonávacie vlákno. Dátové sloty nie sú zdieľané medzi kontextmi volaní na iných logických vláknach. Objekty môžu byť pridané do CallContext, keď sa šíri tam a späť po ceste vykonávacieho kódu a je kontrolovaný jednotlivými objektmi v tejto ceste.
To znamená, že aktuálne vlákno uloží objekt do lokálneho úložiska vlákna a objekt sa zničí, keď je vlákno zničené.
Použite kód:
Scenáre použitia: Osobne si myslím, že sa používa, keď je potrebné objekt použiť globálne v rámci vlákna a ostatné vlákna rozšírenia balíkov k nemu nemajú prístup. Napríklad v dátovom kontexte EF sa pre každú požiadavku vygeneruje vlákno a v tomto čase sa vytvorí dátový kontextový objekt pre rôzne funkcie, ktoré sa nakoniec spoločne commitujú, aby sa predišlo transakčným problémom. Samozrejme, niektorí ľudia sa ma môžu opýtať, či môžem vytvoriť premennú na použitie, ktorá môže dosiahnuť rovnaký účel, ale tento objekt môže tiež interagovať s inými vláknovými dátami, čo je v rozpore s konceptom jedinečnosti vo vlákne.
Možnosť 2
Scenár je založený na webových HTTP požiadavkách, pretože každá požiadavka je nové vlákno a kód je nasledovný:
Použitie "CallContext" v .NET Core
Vieme, že CallContext už nie je dostupný pre . NETStandard alebo .NET Core.
Ale môžete použiť Asynclocal<T> na napodobnenie CallContext, stačí vytvoriť nasledujúcu statickú triedu:
Menné priestory, na ktoré je potrebné odkazovať:
Je tiež jednoduchý na používanie (tu som dal CallContext do knižnice Common):
|