Microsoft.Extensions.ObjectPool jest częścią infrastruktury ASP.NET Core, która wspiera przechowywanie zestawu obiektów w pamięci do ponownego użycia zamiast pozwalać na zbieranie śmieci obiektów. Jeśli obiekty, którymi chcesz zarządzać, są takie, może być konieczne użycie pul obiektów:
- Alokacja/inicjalizacja jest kosztowna.
- Reprezentuje pewne ograniczone zasoby.
- Używaj przewidywalnie i często.
Ponowne wykorzystanie to ważny temat i nieunikniony problem, z którym często napotykamy się na co dzień.
Aby podać najprostszy i najbardziej znany przykład, pule połączeń baz danych to połączenia z bazą danych wielokrotnie używanych.
Jaki jest więc sens ponownego użycia?
Mówiąc wprost, ogranicza to niepotrzebne straty zasobów.
Oprócz połączeń z bazą danych, może istnieć wiele innych obiektów, które wymagają ponownego wykorzystania w różnych scenariuszach lub wymaganiach, a istnieje tzw. Pula Obiektów.
Powinieneś sam zaimplementować podobne funkcje, albo za pomocą ConcurrentBag, ConcurrentQueue, albo innych rozwiązań.
To również dzieli implementację w dokumentacji Microsoftu
Jak: Utworzyć pulę obiektów za pomocą ConcurrentBag
Logowanie do linku jest widoczne.
Oczywiście, w .NET Core Microsoft pomógł nam wdrożyć prostą pulę obiektów.
Najpierw stwórz nowy projekt konsoli .NET Core i użyj polecenia nuget, aby dodać następujący pakiet:
Cały kod wygląda następująco:
Zastosowanie 1
Przed utworzeniem puli musimy zdefiniować Politykę. Tutaj bezpośrednio używamy dołączonego DefaultPooledObjectPolicy do jego konstrukcji.
Pula obiektów będzie miała maksymalną liczbę wątków utrzymywaną.
Użyj metody Get obiektu puli, aby usunąć obiekt z puli obiektów.
Powyższy kod wykonuje wynik
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00:00 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00:00 #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00:00 #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00:00 #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 00:00:00 #9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00 #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00 Wynik ten pokazuje, że obiekty w Object Pool są bezpośrednio nowe, a niektóre właściwości nie są dewaluowane, co często nie ma obecnie większego praktycznego znaczenia.
Ponieważ DefaultPooledObjectPolicy jest nowym obiektem, często nie jest to to, czego się spodziewamy!
Jeśli chcesz spełnić nasze rzeczywiste użytkowanie, musisz samodzielnie zdefiniować politykę!
Przyjrzyjmy się zastosowaniu 2
Zastosowanie 2
Metoda Create służy do utworzenia obiektu Demo, a metoda Return polega na wrzucaniu obiektu Demo z powrotem do puli obiektów (wypożyczony i zwrócony).
Pula obiektów jest tutaj zdefiniowana tak, aby mieścić tylko jeden obiekt.
Ponieważ po wyjęciu z puli obiektów następuje jednokrokowa operacja zwrotu, pozycja 1 i pozycja2 powinny być tym samym obiektem.
Po wyjęciu elementu 2 z puli obiektów nie jest on zwracany, więc pula obiektów tworzy nowy obiekt na podstawie zdefiniowanej przez nas polityki.
Oto wynik końcowy z użycia 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 00:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 00:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15
False Widać, że indywidualne właściwości elementu1, elementu2 i przedmiotu 3 są takie same, a przedmiot 1 i przedmiot2 to rzeczywiście ten sam obiekt. Pozycja 3 i przedmiot 1 to nie to samo.
Zastosowanie 3
Widać, że przedmiot1 i przedmiot2 to ten sam obiekt. Podczas pobierania obiektu z Object Pool, pierwszy zostanie pobrany, więc jeśli go zwrócisz i ponownie pobierzesz, i tak najpierw otrzymasz oryginał.
item3 jest pobierany bezpośrednio z Object Pool i nie jest ponownie tworzony, ponieważ Object Pool tutaj utrzymuje wiele obiektów, a nie tylko jeden w Użyciu 2, więc jest pobierany bezpośrednio z Pool.
Oto wynik wyjściowy
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 3:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 3:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False Tak samo jak w użyciu 2, esencja pozostaje taka sama.
Zastosowanie 4
Wydaje się, że powyższe użycie nie jest tak podobne do naszego normalnego użycia. Wciąż musimy polegać na zastrzykach.
Na koniec przyjrzyjmy się, jak połączyć zastrzyk zależności. Oczywiście, istota tego rozwiązania jest nadal nierozerwalnie związana z dwoma kwestiami: Polisą i Dostawcą.
Najpierw musimy zarejestrować dostawcę, a następnie bezpośrednio wziąć jego instancję, aby utworzyć pulę obiektów.
Jeśli chcesz użyć go gdzie indziej, możesz wstrzyknąć go przez konstruktor.
Efekt tutaj również jest taki sam jak wcześniej, nie ma zbyt wiele do powiedzenia.
streszczenie
Ale bez względu na to, jakiego rodzaju używania, musimy zrozumieć, że Object Pool jest nierozerwalnie związany z trzema osobami: pulą, polityką i dostawcą.
Z tą trójką może możemy robić, co chcemy.
Oczywiście oferuje też kilka wyjątkowych rzeczy, które możesz sprawdzić, jeśli jesteś zainteresowany.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|