Microsoft.Extensions.ObjectPool je súčasťou infraštruktúry ASP.NET Core, ktorá podporuje uchovávanie množiny objektov v pamäti na opätovné použitie namiesto toho, aby umožňovala garbage collection objektov. Ak objekty, ktoré chcete spravovať, sú také, možno budete musieť použiť objektové pooly:
- Alokácia/inicializácia je nákladná.
- Predstavuje obmedzený zdroj.
- Používajte predvídateľne a často.
Opätovné použitie je dôležitá téma a nevyhnutný problém, s ktorým sa často stretávame v našom každodennom vývoji.
Pre najjednoduchší a najznámejší príklad sú databázové spojovacie pooly opakovane používané databázové spojenia.
Aký má teda zmysel opätovného použitia?
Jednoducho povedané, znižuje zbytočné straty zdrojov.
Okrem databázových spojení môže existovať mnoho ďalších objektov, ktoré je potrebné znovu použiť v rôznych scenároch alebo požiadavkách, a existuje takzvaný Object Pool.
Podobné funkcie by ste mali implementovať sami, buď s ConcurrentBag, ConcurrentQueue, alebo inými riešeniami.
Táto implementácia zdieľa aj v dokumentácii Microsoftu
Ako: Vytvoriť objektový pool pomocou ConcurrentBag
Prihlásenie na hypertextový odkaz je viditeľné.
Samozrejme, v .NET Core nám Microsoft pomohol implementovať jednoduchý Object Pool.
Najprv vytvorte nový .NET Core konzolový projekt a použite príkaz nuget na pridanie nasledujúceho balíka:
Celý kód je nasledovný:
Použitie 1
Pred vytvorením poolu musíme definovať Politiku. Tu priamo používame priložený DefaultPooledObjectPolicy na jeho zostavenie.
Objektový pool bude mať udržiavaný maximálny počet vlákien.
Použite metódu Get objektu poolu na odstránenie objektu z objektového poolu.
Vyššie uvedený kód spustí výsledok
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1.1.0001 00:00 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1.1.0001 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 #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 Tento výsledok ukazuje, že objekty v Object Pool sú priamo nové a niektoré vlastnosti nie sú znehodnotené, čo v súčasnosti často nemá veľký praktický význam.
Keďže DefaultPooledObjectPolicy je priamo nový objekt, často to nie je to, čo očakávame!
Ak chcete splniť naše skutočné využitie, musíte si sami definovať poistku!
Pozrime sa na použitie 2
Použitie 2
Na vytvorenie Demo objektu sa používa metóda Create a metóda Return je vrátenie Demo objektu späť do Object Poolu (požičané a vrátené).
Objektový pool je tu definovaný tak, aby obsahoval iba jeden objekt.
Keďže po vybratí z objektového poolu existuje jednokroková návratová operácia, položka1 a položka2 by mali byť ten istý objekt.
Po vyradení položky 2 z objektového poolu sa nevráti, takže object pool vytvorí nový objekt na základe definovanej politiky.
Tu je výstupný výsledok použitia 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 Vidíte, že individuálne vlastnosti položky1, položky2 a položky3 sú rovnaké, a položka1 a položka2 sú skutočne ten istý objekt. Položka 3 a položka 1 nie sú to isté.
Použitie 3
Vidíte, že položka1 a položka2 sú ten istý objekt. Pri načítaní objektu z Object Poolu sa vezme ten prvý, takže ak ho vrátite a znova získate, stále dostanete originál ako prvý.
item3 je prevzatý priamo z Object Poolu a nevytvára sa znova, pretože Object Pool tu udržiava viacero objektov, nie len jeden v použití 2, takže je prevzatý priamo z Poolu.
Tu je výstupný výsledok
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 Rovnako ako pri použití 2, podstata je rovnaká.
Použitie 4
Zdá sa, že vyššie uvedené použitie nie je také podobné nášmu bežnému používaniu. Stále sa musíme spoliehať na injekcie.
Pozrime sa teda konečne na to, ako kombinovať závislostnú injekciu. Samozrejme, podstata je stále neoddeliteľná od dvoch vecí – poistky a poskytovateľa.
Najprv musíme zaregistrovať poskytovateľa a potom priamo vziať jeho inštanciu na vytvorenie objektového poolu.
Ak ho chceš použiť inde, môžeš ho injektovať cez konštruktor.
Výsledok je tiež rovnaký ako predtým, nie je veľa čo povedať.
súhrn
Ale bez ohľadu na to, aký typ použitia to je, musíme pochopiť, že Object Pool je neoddeliteľný od troch ľudí – Pool, Policy a Provider.
S týmito tromi možno môžeme robiť, čo chceme.
Samozrejme, ponúka aj niekoľko špeciálnych vecí, ktoré si môžete pozrieť, ak máte záujem.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|