Microsoft.Extensions.ObjectPool je del infrastrukture ASP.NET Core, ki podpira shranjevanje nabora objektov v pomnilniku za ponovno uporabo namesto dovoljevanja zbiranja smeti objektov. Če so objekti, ki jih želite upravljati, morda uporabiti objektne bazene:
- Dodeljevanje/inicializacija je draga.
- Predstavlja omejen vir.
- Uporabljajte predvidljivo in pogosto.
Ponovna uporaba je pomembna tema in neizogiben problem, s katerim se pogosto srečujemo v našem vsakdanjem razvoju.
Če vzamemo najpreprostejši in najbolj znan primer, so povezovalni bazeni podatkovnih baz ponovno uporabljene povezave z bazo podatkov.
Torej, kakšen je smisel ponovne uporabe?
Preprosto povedano, zmanjšuje nepotrebno izgubo virov.
Poleg povezav z bazo podatkov je lahko še veliko drugih objektov, ki jih je treba ponovno uporabiti v različnih scenarijih ali zahtevah, poleg tega pa obstaja tako imenovani objektni bazen.
Podobne funkcije bi morali implementirati sami, bodisi s ConcurrentBag, ConcurrentQueue ali z drugimi rešitvami.
To si prav tako deli implementacijo v Microsoftovi dokumentaciji
Kako: Ustvariti objektni bazen z uporabo ConcurrentBag
Prijava do hiperpovezave je vidna.
Seveda nam je Microsoft v .NET Core pomagal implementirati preprost Object Pool.
Najprej ustvarite nov .NET Core konzolni projekt in uporabite ukaz nuget za dodajanje naslednjega paketa:
Vsa koda je naslednja:
Uporaba 1
Preden ustvarimo bazen, moramo definirati politiko. Tukaj neposredno uporabljamo priloženi DefaultPooledObjectPolicy za njegovo sestavo.
Objektni bazen bo imel vzdrževano največje število niti.
Uporabite metodo Get objekta bazena, da objekt odstranite iz objektnega bazena.
Zgornja koda izvede rezultat
#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 #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 #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 Ta rezultat kaže, da so objekti v Object Poolu neposredno novi in da nekatere lastnosti niso devalvirane, kar trenutno pogosto nima velikega praktičnega pomena.
Ker je DefaultPooledObjectPolicy pogosto nov objekt, to ni tisto, kar pričakujemo!
Če želite izpolniti našo dejansko uporabo, morate sami določiti politiko!
Poglejmo si uporabo 2
Uporaba 2
Metoda Create se uporablja za ustvarjanje Demo objekta, metoda Return pa je tako, da se Demo objekt vrne nazaj v Object Pool (izposojen in vrnjen).
Objektni bazen je tukaj definiran tako, da vsebuje le en objekt.
Ker obstaja enostopenjska operacija vrnitve po odstranitvi iz objektnega bazena, bi morala biti predmet1 in predmet2 isti objekt.
Po odstranitvi elementa 2 iz bazena objektov ta ni vrnjen, zato bo bazen objektov ustvaril nov objekt na podlagi politike, ki smo jo določili.
Tukaj je izhodni rezultat uporabe 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15. 4. 2020 3:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15. 4. 2020 3:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15. 4. 2020 3:31:15
False Vidite lahko, da so posamezne lastnosti elementa1, predmeta2 in predmeta3 enake, ter da sta predmet1 in predmet2 res isti objekt. Točka3 in točka1 nista isto.
Uporaba 3
Vidite, da sta predmet1 in predmet2 isti objekt. Ko pridobivate predmet iz Object Poola, se vzame prvi, tako da če ga vrnete in ponovno pridobite, boste še vedno dobili original.
element3 je vzet neposredno iz Object Poola tam in se ne ustvari več, ker Object Pool tukaj vzdržuje več objektov, ne le enega v uporabi 2, zato je vzet neposredno iz Poola.
Tukaj je izhodni rezultat
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15. 4. 2020 3:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15. 4. 2020 3:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15. 4. 2020 3:33:58
False Enako kot pri uporabi 2, bistvo je enako.
Uporaba 4
Zdi se, da zgornja uporaba ni tako podobna naši običajni uporabi. Še vedno se moramo zanašati na injekcije.
Torej si na koncu poglejmo, kako združiti injekcijo odvisnosti. Seveda je bistvo tukaj še vedno neločljivo povezano z dvema stvarma – politiko in ponudnikom.
Najprej moramo registrirati ponudnika, nato pa neposredno vzeti njegovo instanco za ustvarjanje objektnega bazena.
Če ga želiš uporabiti drugje, ga lahko vbrizgaš skozi konstruktor.
Rezultat je tudi enak kot prej, ni veliko za povedati.
Povzetek
A ne glede na to, kakšno uporabo gre, moramo razumeti, da je Object Pool neločljivo povezan s tremi člani: Pool, Policy in Provider.
S temi tremi morda lahko počnemo, kar hočemo.
Seveda ponuja tudi več posebnih stvari, ki jih lahko preverite, če vas zanima.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|