|
|
2020-4-15 tarihinde 17:38:34 tarihinde yayınlandı
|
|
|
|

Microsoft.Extensions.ObjectPool, nesne toplama yerine yeniden kullanılmak üzere bir dizi nesne bellekte tutmayı destekleyen ASP.NET Core altyapısının bir parçasıdır. Yönetmek istediğiniz nesneler ise, nesne havuzlarını kullanmanız gerekebilir:
- Tahsis/başlatma maliyetlidir.
- Sınırlı bir kaynağı temsil ediyor.
- Tahmin edilebilir ve sık kullanın.
Yeniden kullanım, günlük gelişimimizde sıkça karşılaştığımız önemli bir konu ve kaçınılmaz bir sorundur.
En basit ve en tanıdık örneği ele almak gerekirse, veritabanı bağlantı havuzları yeniden kullanılan veritabanı bağlantılarıdır.
Peki yeniden kullanmanın amacı nedir?
Basitçe söylemek gerekirse, gereksiz kaynak kaybını azaltır.
Veritabanı bağlantılarına ek olarak, farklı senaryolar veya gereksinimler altında yeniden kullanılması gereken birçok başka nesne olabilir ve sözde bir Nesne Havuzu vardır.
Benzer işlevleri kendiniz de uygulamalıydınız, ya ConcurrentBag, ya ConcurrentQueue veya diğer çözümlerle.
Bu aynı zamanda Microsoft dokümantasyonunda da bir uygulamayı paylaşıyor
Nasıl yapılır: ConcurrentBag kullanarak bir nesne havuzu oluşturulur
Bağlantı girişi görünür.
Tabii ki, .NET Core'da Microsoft, basit bir Nesne Havuzu uygulamamıza yardımcı oldu.
İlk olarak, yeni bir .NET Core konsol projesi oluşturun ve nuget komutunu kullanarak aşağıdaki paketi ekleyin:
Tüm kodlar aşağıdaki gibidir:
Kullanım 1
Bir havuz oluşturmadan önce bir Politika tanımlamamız gerekiyor. Burada doğrudan dahil edilen DefaultPooledObjectPolicy ile oluşturulur.
Nesne havuzunda maksimum sayıda iş parçacığı tutulur.
Havuz nesnesinin Get yöntemini kullanarak nesne havuzundan bir nesne çıkarabilirsiniz.
Yukarıdaki kod sonucu çalıştırıyor
#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: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:00 #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00:00 Bu sonuç, Nesne Havuzu'ndaki nesnelerin doğrudan yenilendiğini ve bazı özelliklerin değersizleştirilmediğini gösterir; bu da şu anda pratik anlamı pek az olur.
DefaultPooledObjectPolicy doğrudan yeni bir nesne olduğu için, çoğu zaman beklediğimiz şey bu değil!
Gerçek kullanımımızı karşılamak istiyorsanız, kendiniz bir poliçe tanımlamanız gerekir!
Kullanım 2'ye bir bakalım
Kullanım 2
Create yöntemi Demo nesnesini oluşturmak için kullanılır ve Return yöntemi ise Demo nesnesini Nesne Havuzuna (ödünç alınıp geri gönderilen) geri atmaktır.
Nesne havuzu burada yalnızca bir nesneyi barındıracak şekilde tanımlanmıştır.
Nesne havuzundan çıkarıldıktan sonra tek adımlı bir geri dönüş işlemi olduğundan, öğe 1 ve öğe 2 aynı nesne olmalıdır.
Öğe 2 nesne havuzundan çıkarıldıktan sonra geri dönmez, bu yüzden nesne havuzu, tanımladığımız politikaya göre yeni bir nesne oluşturur.
İşte 2. kullanımın çıktı sonucu şöyle:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/04/2020 03:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/04/2020 03:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15/04/2020 03:31:15
False Öğe 1, madde 2 ve madde 3'ün bireysel özelliklerinin aynı olduğunu ve madde 1 ile madde 2'nin gerçekten aynı nesne olduğunu görebilirsiniz. Madde 3 ve madde 1 aynı şey değildir.
Kullanım 3
Eşya 1 ve madde 2'nin aynı nesne olduğunu görebilirsiniz. Nesne Havuzu'ndan bir nesne alındığında, ilk nesne alınır, yani geri getirip tekrar alırsanız önce orijinal nesneyi alırsınız.
item3 doğrudan oradaki Nesne Havuzundan alınır ve tekrar oluşturulmaz, çünkü buradaki Nesne Havuzu birden fazla nesne tutar, sadece bir değil, 2. kullanımda doğrudan Havuzdan alınır.
İşte çıktı sonucu
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15/04/2020 03:33:58
False Kullanım 2'de olduğu gibi, özü aynı.
Kullanım 4
Yukarıdaki kullanım şekli normal kullanımımıza çok benzemiyor gibi görünüyor. Hâlâ enjeksiyona güvenmemiz gerekiyor.
O halde bağımlılık enjeksiyonunu nasıl birleştireceğimize son olarak bakalım. Elbette, buradaki öz, Politika ve Sağlayıcı olmak gibi iki şeyden ayrılmaz bir noktadır.
Önce Sağlayıcıyı kaydetmemiz gerekiyor, ardından doğrudan onun örneğini alıp bir Nesne Havuzu oluşturmamız gerekiyor.
Başka bir yerde kullanmak isterseniz, yapıcının üzerinden enjekte edebilirsiniz.
Buradaki sonuç da öncekiyle aynı, söylenecek pek bir şey yok.
özet
Ama kullanım türü ne olursa olsun, Object Pool'un Pool, Policy ve Provider'dan ayrılmaz olduğunu anlamamız gerekiyor.
Bu üçüyle belki istediğimizi yapabiliriz.
Elbette, ilgileniyorsanız göz atabileceğiniz birkaç özel şey de sunuyor.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|
Önceki:Web Hizmetleri Geliştirmelerine Giriş (WSE) 3.0Önümüzdeki:Visual Studio 2013, birden fazla satırın yerine geçen içeriği nasıl buluyor?
|