Pomocí EF pro manipulaci s databází, extrakce DbContext (třída databázových operací) ve stejném HTTP požadavku pro zajištění jedinečnosti, článek používá dvě schémata k zajištění jedinečnosti kontextu Entity Framework a řešení na platformě .NET Core je připojeno.
Možnost 1
Pokud je objekt zaručeně globálně jedinečný, určitě si představíte klasický návrhový vzor: singleton mode, pokud musí být použitý objekt jedinečný ve vlákně?
Datový slot: CallContext, viz vysvětlení callcontentu v msdn.
CallContext je dedikovaný objekt kolekce podobný vláknovému lokálnímu úložišti pro volání metod a poskytuje datový slot, který je jedinečný pro každé logické vykonávací vlákno. Datové sloty nejsou sdíleny mezi kontexty volání na jiných logických vláknech. Objekty lze přidávat do CallContextu, když se šíří tam a zpět po cestě vykonávacího kódu a je kontrolován jednotlivými objekty v této cestě.
To znamená, že aktuální vlákno uloží objekt do lokálního úložiště vlákna a objekt je zničen, jakmile je vlákno zničeno.
Použijte kód:
Scénáře použití: Osobně si myslím, že se používá, když je potřeba objekt globálně použít ve vlákně a ostatní vlákna rozšíření thread package k němu nemají přístup. Například v datovém kontextu EF bude pro každý požadavek vygenerováno vlákno a v tuto chvíli se vytvoří objekt datového kontextu pro různé funkce, které se nakonec společně zavázají, aby se předešlo problémům s transakcemi. Samozřejmě, někteří lidé se mě mohou zeptat, jestli mohu vytvořit proměnnou, která by mohla použít stejný účel, ale tento objekt může také interagovat s dalšími daty vlákna, což je v rozporu s konceptem jedinečnosti vlákna.
Možnost 2
Scénář je založen na webových HTTP požadavcích, protože každý požadavek je nové vlákno a kód je následující:
Použití "CallContext" v .NET Core
Víme, že CallContext již není dostupný pro . NETStandard nebo .NET Core.
Ale můžete použít Asynclocal<T> k napodobení CallContext, stačí vytvořit následující statickou třídu:
Jmenné prostory, které je třeba odkazovat:
Je také snadno použitelný (zde jsem dal CallContext do knihovny Common):
|