Microsoft.Extensions.ObjectPool on osa ASP.NET Core infrastruktuurist, mis toetab objektide kogumi hoidmist mälus taaskasutamiseks, selle asemel et lubada objektide prügi kogumist. Kui objektid, mida soovid hallata, võivad vajada objektide kogumite kasutamist:
- Eraldamine/initsialiseerimine on kulukas.
- Esindab mõningaid piiratud ressursse.
- Kasuta etteaimatavalt ja sageli.
Taaskasutus on oluline teema ja vältimatu probleem, millega me sageli igapäevases arengus kokku puutume.
Lihtsaima ja tuttavaima näitena on andmebaasi ühenduste basseinid taaskasutatud andmebaasiühendused.
Mis siis on taaskasutamise mõte?
Lihtsalt öeldes vähendab see tarbetut ressursikadu.
Lisaks andmebaasi ühendustele võib olla palju teisi objekte, mida tuleb erinevates olukordades või nõuetes taaskasutada, ning on olemas nn objektide kogum.
Sa oleksid pidanud ise sarnaseid funktsioone rakendama, kas ConcurrentBaki, ConcurrentQueue või teiste lahendustega.
See jagab ka Microsofti dokumentatsioonis olevat rakendust
Kuidas: luua objektide kogum, kasutades ConcurrentBagi
Hüperlingi sisselogimine on nähtav.
Loomulikult on Microsoft .NET Core'is aidanud meil rakendada lihtsat objektide pooli.
Esiteks loo uus .NET Core konsooliprojekt ja kasuta nuget käsku järgmise paketi lisamiseks:
Kõik koodid on järgmised:
Kasutus 1
Enne basseini loomist peame määratlema poliitika. Siin kasutame otse kaasasolevat DefaultPooledObjectPolicy selle koostamiseks.
Objektide poolil on maksimaalne arv lõime, mida hoitakse.
Kasuta basseini objekti Get meetodit, et võtta objekt objektide basseinist välja.
Ülaltoodud kood käivitab tulemuse
#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 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 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 #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:00 See tulemus näitab, et objektide kogumi objektid on otseselt uuendatud ning mõned omadused ei devalveerita, mis praegu sageli praktiliselt ei oma.
Kuna DefaultPooledObjectPolicy on otse uus objekt, pole see tihti see, mida ootame!
Kui soovid meie tegelikku kasutust täita, pead ise poliisi määratlema!
Vaatame kasutust 2
Kasutus 2
Create meetodit kasutatakse demo objekti loomiseks ning Return meetod on demo objekti tagasi Object Pooli (laenatud ja tagastatud) meetodit.
Objektide hulk on siin määratletud nii, et see sisaldab ainult ühte objekti.
Kuna pärast objekti basseinist eemaldamist toimub üheastmeline tagastusoperatsioon, peaksid üksus 1 ja item2 olema sama objekt.
Pärast seda, kui üksus 2 objektide basseinist välja võetakse, seda enam ei tagastata, seega loob objektide kogum uue objekti vastavalt meie defineeritud poliitikale.
Siin on kasutuse 2 väljundtulemus:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 3:31:15 AM 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 3:31:15 AM
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 03:31:15
False Näed, et üksuse 1, üksuse 2 ja item3 individuaalsed omadused on samad ning üksus 1 ja item2 on tõepoolest sama objekt. Item 3 ja item1 ei ole sama asi.
Kasutus 3
Näed, et item 1 ja item2 on sama objekt. Kui tood objekti Object Poolist, võetakse esimene, nii et kui sa selle tagasi tood ja uuesti kätte saad, saad ikkagi originaali esimesena.
item3 võetakse otse sealt objektide poolist ega loo uuesti, sest objektide bassein hoiab mitut objekti, mitte ainult ühte kasutuses 2, seega võetakse see otse basseinist.
Siin on väljundtulemus
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False Sama mis kasutuses 2, on olemus sama.
Kasutus 4
Tundub, et ülaltoodud kasutus ei ole nii sarnane meie tavapärasele kasutusele. Me peame ikka lootma süstimisele.
Vaatame lõpuks, kuidas kombineerida sõltuvussüsti. Muidugi on siin olemus lahutamatu poliitika ja teenusepakkuja kahest asjast.
Esmalt peame registreerima teenusepakkuja ja seejärel võtma otse selle eksemplari, et luua objektide bassein.
Kui tahad seda mujal kasutada, saad selle läbi konstruktori süstida.
Tulemus on siin sama mis varem, palju pole öelda.
Kokkuvõte
Aga ükskõik millist kasutusviisi see ka poleks, peame mõistma, et Object Pool on lahutamatu kolmest mehest – Pool, Policy ja Provider.
Nende kolmega ehk saame teha, mida tahame.
Loomulikult pakub see ka mitmeid erilisi asju, mida saad uurida, kui oled huvitatud.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|