Używając EF do manipulacji bazą danych, wyodrębniania DbContext (klasy kontekstu operacji bazy danych) w tym samym zażądaniu HTTP w celu zapewnienia unikalności, artykuł wykorzystuje dwa schematy zapewniające unikalność kontekstu Entity Framework, a rozwiązanie na platformie .NET Core jest dołączone.
Opcja 1
Jeśli obiekt jest gwarantowany globalnie unikalny, na pewno pomyślisz o klasycznym wzorcu projektowym: tryb singleton, jeśli użyty obiekt musi być unikalny w wątku?
Slot danych: CallContext, ok, zobacz wyjaśnienie callcontentu w msdn.
CallContext to dedykowany obiekt kolekcji, podobny do lokalnego magazynu wątków dla wywołań metod, zapewniający slot danych unikalny dla każdego logicznego wątku wykonawczego. Sloty danych nie są współdzielone między kontekstami wywołań w innych wątkach logicznych. Obiekty mogą być dodawane do CallContext, gdy ten propaguje się tam i z powrotem wzdłuż ścieżki kodu wykonania i jest kontrolowany przez poszczególne obiekty na tej ścieżce.
Oznacza to, że bieżący wątek przechowuje obiekt w lokalnej pamięci pamięci wątku, a obiekt jest niszczony wraz z niszczeniem.
Użyj kodu:
Scenariusze użycia: Osobiście uważam, że jest używana, gdy obiekt musi być używany globalnie w wątku, a inne wątki rozszerzenia pakietu wątków nie mają do niego dostępu. Na przykład w kontekście danych EF dla każdego żądania zostanie wygenerowany wątek, a w tym momencie utworzony zostanie obiekt kontekstu danych, z którego różne funkcje mogą korzystać i ostatecznie zatwierdzać się razem, aby uniknąć problemów z transakcjami. Oczywiście niektórzy mogą zapytać mnie, czy mogę stworzyć zmienną do użycia, która również może osiągnąć ten sam cel, ale ten obiekt może też oddziaływać z innymi danymi wątków, co stoi w sprzeczności z koncepcją bycia unikalnym w wątku.
Opcja 2
Scenariusz opiera się na żądaniach web http, ponieważ każde żądanie to nowy wątek, a kod wygląda następująco:
Korzystanie z "CallContext" w .NET Core
Wiemy, że CallContext nie jest już dostępny dla . NETStandard lub .NET Core.
Możesz jednak użyć Asynclocal<T>, aby naśladować CallContext, wystarczy utworzyć następującą klasę statyczną:
Przestrzenie nazw, do których należy się odwoływać:
Jest też łatwy w użyciu (tutaj umieściłem CallContext w bibliotece Common):
|