13 Aralık 2022 Salı

Repositoryde Return Type Ne Olmalıdır : IQueryable, IEnumerable or IReadOnlyList?




IEnumerable ve IQueryable  çoğu geliştirici tarafından kullanımı karıştırılmakta ve ne zaman nerede kullanılacağı bilinmemektedir.  Kod yazım tipleri birbirine çok benzerdir. Fakat kullanım yerleri işlevselliklerine göre değişir. Yanlış kullanımlar sistem performansını oldukça kötü etkiler.

Repository kullanarak Get ile bir Domain Object Collectionu (GetUsers, GetProduct) geriye dönmek istediğimizde bir kaç dönüş türü arasında seçim yapabiliriz.

  • IQueryable<T>
  • IEnumerable<T>
  • IReadOnlyList<T>
Yukarıdaki return typelerden herhangi birini seçmemiz uygulamamızın performansını, tasarımını ve sürdürülebilirliğini etkileyebilir. Bu nedenle bilinçli bir seçim  yaparak projemizin Access Layerını oluşturmalıyız.

Yukarıdaki bir User sınıfımız ve AppDBContext isminde bir contextimiz olduğunu düşünelim.

IQueryable<T> Return Type

IQueryable<T> interfacesi, C# expressionlarını direkt olarak veritabanı tarafında execute edilebilecek T-SQL sorgularına dönüştürmemize olanak tanır. 
Fakat burada yazılan sorgunun sonuna ToList() demedikçe databaseye sorgu atılmayacaktır.



Yukarıda GetUsers() metodunun resultı bizim için hazır bir T-SQL sorgudur. Henüz databaseden kayıt çekilmemiştir.



Önemli Detaylar
  • Veritabanı sorgusu, yalnızca sonuç gerçekten istendiğinde execute edildi.(GetUsers() ta değil, yalnızca ToList() yöntemi çağrılırken).
  • Where ifadeleri ekleyerek sorgu hazırlanmaya devam ediyoruz. Hala veritabanından kayıt çekmedik
  • ToList() metodunu ekleyerek artık filtrelerle( where vs.)  hazırladığımız sorguyu veritabanına gönderiyoruz.
Yukarıdaki şekilde bir tane Repository içerisine  GetUsers() metodu yazılır ve bu repositoryi kullanan  her yerden GetUserrs() metodunu çağırıp where koşulu eklenerek istenen sorgular dinamik bir şekilde hazırlanabilir. Fakat bu kullanımında dez avantajları vardır.

1- Dublicate Domain Rules

Örneğin Aktif kullanıcı listesi diye bir Domain kuralımız olduğunu ve kuralın bir çok servis tarafından kullanıldığını düşünelim. Tüm servislerin içerisinde aşağıdaki gibi kullanılsın.


Daha sonra aktif userın domain kuralın değiştiğini ve son bir yıldan önce kaydedilmiş kişilerin aktif user olduğu kuralı eklediğimizi düşünelin. Yukarıdaki kodun geçtiği her yere gidip güncelleme yapmamız aşağıdaki şekilde güncelleme yapmamız gerekecektir.


Bu nedenle, codebase bakımı daha zor hale gelir çünkü birkaç yerin güncellenmesi gerekir ve bir şeyler kolayca gözden kaçabilir.


IEnumerable<T> Return Type

IEnumrable<T> yapılan sorgularda filtreler(where vs.) T-SQL sorgusuna çevrilmez. İlk olarak DB den bütün kayıtlar çekilir ve belleğe kaydedilir. Daha sonra bu belleğe alınmış kayıtlar üzerinde filtreler yani where koşulları  uygulanır. 



fark 1


İlk bakışta aynı duran yukarıdaki 2 kod satırı aynı zamanda aynı sonucu dönüyorlar fakat arka planda çalışma prensipleri farklı. Şöyle ki, IQueryable olan 1.satır direkt olarak sunucuda çalışacağı için belirtilen tablodan ilk 10 değeri atlayıp ikinci 10 satırı çeker. IEnumerable ise tüm satırları çeker ve hepsini bellekte tutar daha sonra ilk 10 kaydı atlayıp ikinci 10 kaydı gösterir. Aslında IEnumerable'da tüm tabloyu tutuyor ve hala diğer değerlerle ilgili işlem yapılabilir.

fark 2


Burada kodu derlemek istediğimizde her hangi bir hata ile karşılaşmayız, fakat run time'de kod hata fırlatır. Bunun sebebi T-SQL içinde Convert.ToInt32() metodunun olmayışıdır. Çünkü IQueryable sorguyu sunucuda derler demiştik. Bunun aşağıdaki şekilde çalıştırdığımızda her hangi bir hata ile karşılaşmayacağız.

 
IEnumerable, IQueryable tersine sorguyu sunucuda çalıştırmaz. Önce tüm verileri belleğe alır demiştik, daha sonra alınan verilere filtreleme işlemi yapıyoruz. Doğal olarak artık Convert.ToInt32() ile her hangi bir problem yaşamıyoruz.

IEnumerable Linq => Object işlemlerinde daha yararlı iken IQueryable Linq => Sql işlemlerinde daha kullanışlıdır.

İkisi de "Deferred Execution" destekler. Türkçesi ertelenmiş çalışmadır. Şöyle ki Linq sorguları hemen çalışmaz. Belirli bir komuta kadar bekler. Bunu tetikleyenlerden bir tanesi de ToList() metodudur. Sorgu düzenlenir, fakat çalıştırılmaz ta ki ToList() metodu çağrılır ve veri tabanına istek yapılıp veri getirilir.

IReadOnlyList<T> Return Type


IReadOnlyList, C# programlama dilinde bir interface'tir. IReadOnlyList, bir liste gibi düzenlenmiş verileri depolayan ve bu verilere sadece okuma işlemleri yapmaya izin veren bir yapıdır. IReadOnlyList, bir dizinin içeriğini değiştirmek için kullanılamaz ancak verileri okumak ve kullanmak için kullanılabilir. Bu interface, hem performans hem de güvenlik açısından avantajlıdır ve C# programlama dilinde sıklıkla kullanılır.


Add,Remove vs işlemleri IReadOnlyList üzerinde yapılamaz.


Reference 

9 Aralık 2022 Cuma

MVC Architecture Pattern

Problem
- 1970'li yıllarda GUI ve Desktop uygulamaları popülerdi ve 2 ana sorumlulukları vardı.
- Screen layout  ve Logic
- Bu yüzden View ve Logic  bir birine sıkı bir şekilde bağlıydı. View veya Logicde birşeyler yaptığımızda her ikisini de kontrol etmemiz gerekiyordu ve paralel olarak geliştirme yapılamıyordu.

-View ve Logic bir birine sıkı bir şekilde bağlı ve bizim bunları ayırmamız gerekiyor. Bu ayrımada Separated Presentation denilir. Separed Presentationun amacı Domain Objeleri ile ekranda gördüğümüz GUI objeleri arasında net bir ayrım yapmaktır.

-Presentatiın kısmı View ve Contollerdan oluşur. Logic yada Domain element denilen kısımda Model olarak adlandırılır.


MVC

- Bir uygulamayı bir biriyle bağlantılı üç parçaya bölen bir arayüz tasarım desenidir. Katmanlı mimari değildir.
- Bir kullanıcıya bir form içerisinde data göstermek yada kullanıcıdan bir form vasıtasıyla data kabul etme işlerini birbirinden ayırmak için kullanılır.
- MVC tasarım deseni kodun yeniden kullanılmasına ve paralel olarak geliştirme yapabilmek için bu ana bileşenleri ayırır.

Model
- Model, MVC’de projenin iş mantığının (business logic) oluşturulduğu bölümdür. İş mantığıyla beraber doğrulama (validation) ve veri erişim (data access) işlemleri de bu bölümde gerçekleştirilmektedir.
- Model, View ve Controller hakkında hiç bir bilgiye sahip değildir.

View
- Kullanıcıların uygulama ile etkileşimde bulanabileceği yer burasıdır.
- View, MVC’de projenin arayüzlerinin oluşturulduğu bölümdür. Bu bölümde projenin kullanıcılara sunulacak olan HTML dosyaları yer almaktadır
- View’ın bir görevi de, kullanıcılardan alınan istekleri controller’a iletmektir.
- MVC'nin bazı varyasyonlarında View, Model ile doğrudan etkileşime girmez.
- Ancak başlangıçta MVC, View bölümünü güncellemek için Modeldeki tüm değişiklikleri bilmek için Observer Patterni kullanır.

Controller
- Bu bölümde View ile Model arasındaki bağlantı kurulur. Kullanıcılardan gelen istekler (request) Controller’larda değerlendirilir, isteğin detayına göre hangi işlemlerin yapılacağı ve kullanıcıya hangi View’ın döneceği (response) belirtilir.

MVC Çalışma Prensibi

Bir MVC projesinde kullanıcı, tarayıcı üzerinden (View) sayfaya istek yaptığında bu istek Controller’a iletilir. Controller isteği gerçekleştirmek üzere model ve bağlantılı bileşenleri ile gerekli sınıf ve metotları çağırır. Elde ettiği sonuçları View’e göndererek sayfanın görüntülenmesini sağlar.

5 Aralık 2022 Pazartesi

Middleware ve Pipeline



ASP .NET Pipeline , ASP .NET'in bir web applicationına veya web servisine  yapılan requestlerin handle edildiği süreçtir.
  • Bir user, Web browser aracılığıyla bir web application yada web servise request gönderir.
  • Request, ASP .NET uygulamasını barındıran(hosting eden) web sunucusu tarafından alınır.
  • Web sunucu, Requesti ASP .NET runtime iletir. ASP.NET'e gelen requestler Thread Pooldaki Threadler tarafından ele alınır.Thread poolda yaklaşık 5000 adet thread bulunmaktır.Eğer bu threadlerin hepsi dolarsa web sunucusunun Queuesuna alınır. Eğer burasıda dolarsa uygulama 503 : Server To Busy Hatası verir . Bunu önlemek için web servisimizi asenkron olarak kodlamaya özen göstermeliyiz.
  • ASP .NET Runtime , Requesti işler ve requesti ve kullanıcıya geri gönderilecek response hakkındaki bilgileri içeren bir HTTP Context oluşturur.
  • Request , ASP .NET pipelinedaki bir dizi adımdan veya "aşamalardan" geçirilir.

Middleware, Web te bir request’in response’a dönüşene kadar arada geçen süreci handle etmemizi sağlayan yapıdır diyebiliriz.Yani request ile response arasına müdahale etmemizi sağlayan ara katman görevi görür.

Her middleware, pipeline üzerinde kendisinden sonra gelen componeti çalıştırmak veya short-circuiting  ile direk response cevabı vermek ile görevlidir


Uygulama içerisinde tanımlı olan middleware'ler register edilme sırasıyla birlikte yukarıdaki resimde olduğu gibi birbirlerini call ederek pipeline'ı tamamlarlar. 



 

 




ASP.NET Core Derinlemesine Dependency Injection

 Dependency Injection, Bir sınıfın bağımlı olduğu sınıfların, bu sınıf içine dışarıdan enjekte edilme işlemidir. Temel amaç somut sınıflara olan bağımlılığı ortadan kaldırmak ve test edilebilirliği kolaylaştırmaktır.



Bir servis DataServiceye bağımlıysa direkt olarak DataServicenin kendisine bağımlıdır. Bunun gibi servisleri test etmek zor olabilir . Bunun yerine servisimiz IDataServiceye bağlıysa sadece inteface tarafından sağlanan contractlar önemsenir. Hangi uygulamanın implemente edildiğinin bir önemi kalmaz. Servisin davranışını test etmek için IDataServicenin Mockunu kullanabiliriz.

Service Lifetime 

Singleton, Yalnızca tek bir instancenin oluşturulacağı anlamına gelir. Bu instance, kendisine ihtiyaç duyan tüm componenentler tarafından ortak kullanılır.  Böylece hep aynı nesne kullanılmış olur.

Scoped, Uygulamaya yapılan her request için bir intance oluşturulur. Ve bu request için response dönene kadar hep aynı instance kullanılır. Request sonlanana kadar ihtiyaç duyulan  her constructer içerisine aynı nesne injecte edilir.

Transient, Her zaman yeni bir instance oluşturulur. Bir request boyunca her constructerda yeni bir instance oluştururlur.

Not: Bir Component Lifetime süresi kendinden kısa olan bir componente bağımlı olamaz. Örneğin singleton A servisinin construterında scoped bir B servisine bağımlı olamaz.


Implementation factories



DataService nesnesini, IOtherService componentini kullanarak oluşturmak istesek yukarıdaki gibi yapabiliriz.

GetRequiredService<T> yerine GetService<T> de  kullanabiliriz. İkisi arasındaki fark GetRequirdeService de eğer nesne bulunamazsa geriye null döner. fakat GetService bulamazsa geriye InvalidOperationException  exception fırlatır.


Decorator Pattern Configuration





Yukarıdaki UML'e baktığımızda decorator kalıbı kullanılmıştır. IDataService interfacesi DataService sınıfı tarafından implemente edilmiştir. DataService sınıfına run-time da yeni bir özellik eklemek istediğimizde decorator tasarım kalıbını kullanabiliriz. Bu yeni özelliği IDataServiceyi implemente eden CacheDataService sınıfı içerisinde yapacağız. 






Yada aşağıdaki gibi Scrutor kullanarak yapabiliriz.
Package Managert consoldan   NuGet\Install-Package Scrutor  indirilir.




Generic Yapıları Register Etme




2 Aralık 2022 Cuma

REST API

HTTPS Nasıl Çalışır ?


 

- HTTPS olmadan, browser ile server arasındaki iletişim düz metindir.  Bu, girdiğiniz şifrenin veya internet üzerinden gönderdiğiniz kredi kartı numarasının, onu ele geçirme yeteneği olan herkes tarafından okunabileceği anlamına gelir.

- HTTPS, bu sorunu çözmek için internet üzerinden gönderilen verileri gönderici ve alıcı dışında kimse tarafından okunamaz hale getirmek için tasarlanmıştır. 

- HTTPS, HTTP protokolünün bir uzantısıdır.

-HTTPS ile veriler, TLS adı verilen bir şey kullanılarak şifrelenmiş bir biçimde gönderilir. TLS (Transport Layer Security) protokolü aracılığıyla da güvenlik oluşturur. TLS, bu veri aktarımının değişmesi ya da bozulmasını önleme özelliğine sahiptir. 

-Şifrelenmiş veriler bir bilgisayar korsanı tarafından yakalanırsa, tek görebildikleri karmakarışık verilerdir. TLS hand shakenin(el sıkışma) devreye girdiği yer burasıdır.






1 Aralık 2022 Perşembe

Browsera bir URL yazdığımızda ne olur ?

 









1-  Bob tarayıcıya bir URL girer ve enter tuşuna basar. Sonra ne olur ?
- URL, universal resource locator, anlamına gelir ve dört bölümden oluşur. 
- Birincisi Şema Schema,  http:// . Bu, tarayıcıya HTTP adı verilen bir protokol kullanarak sunucuya bağlanmasını söyler. Diğer bir yaygın şema HTTPS'dir. HTTPS ile bağlantı şifrelenir.
-URL'nin ikinci kısmı bir Domaindir. Yukarıdaki örnekte  example.com sitenin domain ismidir. 
-URL'nin üçüncü kısmı Path dir  ve dördüncü kısmı Resourcedir. Bu ikisi arasındaki fark genellikle çok net değildir: Directory  ve File olarak düşünülebilir.
- Browserin servera  nasıl ulaşacağını bilmesi gerekiyor. Bu örnekte example.com domain ismidir. DNS lookup adı verilen bir işlemle yapılır. (Domain Name System). İnternetin telefon rehberi gibi düşünebiliriz. DNS, alan adlarını IP Adreslerine çevirir, böylece browserlar resourceleri yükleyebilir.





2-Lookup sürecini hızlandırmak için, DNS bilgileri büyük ölçüde önbelleğe alınır. İlk olarak, browserin kendisi kısa bir süre için önbelleğe alır. Ve eğer bu bilgi browserda değilse, işletim sisteminden bunu ister. işletim sistemininde  bunun için bir önbelleği vardır. Bu da cevabı kısa bir süre için tutar.. 




2.1Artık işletim sisteminde yoksa, internetten bir DNS resolvera (DNS çözümleyici) sorgu yapar. Bu, IP Adresi çözümlenene kadar bir request zinciri başlatır. Bu işlemin DNS alt yapısındaki birçok sunucuyu içerdiğini ve yanıtın her adımda önbelleğe alındığını unutmamak gerekir. Şimdi nihayet browserimiz , Serverin IP Adresine sahip.(example.com un IP adresine ulaşılmış oldıu.)




3- Browserimiz elde ettiği  IP Adresini kullanarak server ile TCP bağlantısı kurar. TCP Bağlantısı kurmakla ilgili bir hand shake yapılır. Bu hand shakenin tamamlanması için birkaç ağ gidiş gelişi gerekir. Hızlı loadinge devam etmek için, modern tarayıcılar keep-alive bağlantısı adı verilen bir şey kullanarak sunucuya kurulmuş bir TCP Bağlantısını mümkün olduğu kadar yeniden kullanmayı dener. Unutulmaması gereken bir nokta, eğer protokol HTTPS ise, yeni bir bağlantı kurma süreci daha da karmaşıktır. 
Browser  ve server arasında şifreli bağlantı kurmak için SSL/TLS adı verilen karmaşık bir işlem gerektirir. Hand shake  maliyetlidir ve browserlar , maliyeti düşürmeye çalışmak için SSL Oturumu devam ettirme gibi hileler kullanır.




4 - 5 Son olarak browser, kurulan TCP Bağlantısı üzerinden servera bir HTTP requesti gönderir. HTTP'nin kendisi çok basit bir protokoldür. Server requesti işler ve geriye bir response gönderir.


6- Browsert responsu alır ve html içeriğini render eder. Çoğu zaman javascript paketleri ve images gibi yüklenecek ek resourceler de vardır.