Singleton Desing Pattern

Singleton patterni ile bir nesnenin çalışma zamanında tek olmasını garanti edebiliriz. Böyle söyleyince kafamızda bir şeyler canlanmadıysa daha somut örnekler veriyim. Örneğin;

  • veritabanı kullandığımız uygulamalarımızda connectionString bilgisini okumak için kullanabiliriz.
  • Projemizdeki konfigürasyon bilgilerini okumak için de kullanabiliriz.

 

İmplementasyonu çok basit. Aşağıdaki UML şemamızı inceleyerek işe başlayalım.

  • Singleton isimli bir class oluşturduk.
  • Bu class’ın constructorını private olarak tanımlıyoruz. Bunun sebebi ise herkes Singleton singleton=new Singleton() şeklinde belleğe yeni bir nesne yaratmasını engellemek.
  • Yine private olarak Singleton tipinde bir _instance yaratıyoruz.
  • Bu nesneye ulaşmak için ReturnInstance tipinde public bir metot yazıyoruz.
Bu şekilde classımız yazmış olduk. Ama asenkron işlemlerde kullanmak istersek bu metodumuzu thread safe hale getirmeliyiz. Bunu da lock koyarak halledebiliriz.
 

 

.NET Core ve Redis Kullanarak Distributed Cache Mekanizması Kurma

Redis Nedir?

Redis özünde key-value tipinde NoSQL bir veritabanıdır.  En önemli artısı ise verileri bellekte tutmasıdır. Çoğunuzun aklına bizim çok datamız var bu kadar belleği nereden bulacağız gibi sorular gelebilir. String-string tipinde datalar tutuyorsak 1M adet data 100 mb gibi bir yer kaplıyor.

Öncelikle Redis’i yükleyelim;

  • Komut satırını yönetici olarak çalıştırıp aşağıdaki kodu çalıştıralım.
  • Chocolatey yüklendikten sonra şimdi de Redis’i yükleyelim
  • Komut satırına “redis-server” yazdığımızda aşağıdaki gibi bir ekranla karşılaşmamız lazım.

Şimdi bir tane .NET Core Web API oluşturalım. Bu örnek projede database first olarak ilerleyeceğim. Hedefim ise öğrenci bilgilerini bu öğrencinin aldığı dersleri tutmak üzerine olacak. Basitçe aşağıdaki veritabanını tasarladım.

Şimdi API endpointlerimizi oluşturalım ve cache olmadan bir benchmark çalıştıralım. Sonuçlarımıza bakalım.

ID’si girilen öğrencinin adını soyadını ve aldığı dersleri bize dönen endpointimiz yazdık.

Şimdi “ab – Apache HTTP sunucusu başarım ölçme aracı” ile sunucumuza yük bindirelim.

Şimdi projemize Redis Cache ekleyelim.

  • Nuget üzerinden “Microsoft.Extensions.Caching.Redis.Core” paketini yükleyelim.
  • Controllerimize aşağıdaki değişkeni global olarak ekleyelim.
Controllerimizde gerekli değişikleri yapalım.
Benchmark sonuçlarımıza göz atalım.

 

Kaynak kod: https://github.com/limanerkan/RedisTutorial

 

Computer Vision APİ Kullanımı

Selamlar,

Önceki yazımda RESTful api tasarlama ilkelerinden bahsetmiştim. Bu yazımda ise bu ilkeleri kullanarak bir api geliştireceğiz. Microsoft’un fotoğraf analizleri için geliştirdiği ve azure platformu üzerinde bizlere sunduğu Computer Vision API’sini kullanacağız. Projemizde kullanacağımız ekipmanlar ise şöyle;

  • .NET Core 1.1 Web API
  • Swagger
  • Azure Blob
  • Azure Computer Vision API

Projemiz API üzerinden bize post edilen imajı Azure Blob’a atacak. Bu esnada bu imaj Vision API aracılığıyla işlenecek ve taglenecek. Sonrasında biz bu imajları kategorilerine göre sınıflandırabileceğiz ya da tagler üzerinden arama yapabileceğiz.

Hadi başlayalım.

Öncelikler .NET Core Web API projesi oluşturalım. Daha sonra projemize RESTful apiler için dokümantasyon aracı olan Swagger’i kuralım.

Packege Manage Console’a aşağıdaki komutu verelim

Sonrasında Startup.cs içerisindeki gerekli yerlere eklemeleri yapalım.

Swagger aracını yüklemiş olduk. http://localhost:portNo/swagger/ adresine gittiğimizde aşağıdaki gibi bir ekranla karşılaşmamız lazım.

Şimdi ImageController isminde bir conroller oluşuralım. Sadece get ve post metotları olsun.

Swagger eklentimizde. Fotoğraflarımızı upload etmek için ufak birkaç değişiklik yapmamız gerekiyor ki aşağıdaki gibi dosyayı seçebilelim.

FileOperation isimli bir class oluşturalım. Startup.cs içinde aşağıdaki değişikleri yapalım.

Swagger aracındaki gerekli ayarlamaları yaptıktan sonra azure üzerinde blob yaratalım.

New>Storage>Storage Account

Sonrasında ise Blob Service içinde profileimages isminde bir container yaratalım. Aynı şekilde bir tane de computer vision api oluşturalım.

New>AI+Cognitive Services>Computer Vision API

Şimdi kodlarımızı yazmaya başlayabiliriz.

Blob container içine resmi upload edecek ve resmi çağırınca getirecek bir class yazalım.

NOT: Azure üzerinde blob oluşturduğumuzda blob ismini, konteyner ismini ve keyimizi bir yere not edelim ve aşağıdaki classta gerekli yerlere yazalım.

 

Yukarıdaki classta yükleyeceğimiz resmin ismini benzersiz yapmalıyız. Aksi taktirde aynı isimle resim yüklenirse çakışma olabilir bunu için FileNameHelper isimli bir class yazdım. Basitçe bir guid oluşturuyor.

Şimdi ise vision api ile yüklenen resmin taglemek için gerekli işlemleri yapan classımızı yazalım.

Son olarak endpointlerimizde yukarıda yazdığımız classları çağıralım.

 

Aşağıdaki resmi upload edelim ve taglarine bakalım.

Sonuçlarımıza bakalım.

Caption değerimiz : a young boy sitting at a table with a plate of food with broccoli

Categories: people_young  ve fotoğrafra 20’ye yakın tag oluşturdu şimdi ise bu taglerden birisi ile arama yapalım. Bakalım API miz bize bu fotoğrafın bilgilerini geri dönecek mi?

Projeyi buradan indirebilirisiniz

https://github.com/limanerkan/AzureBlobAndVisionApi