Middleware Nedir?
Asp.net Core ile .net dünyasına da gelen bir kavramdır.
.net core startup.cs deki Configure() methodunda yapılandırabiliyoruz
Middleware app ile enjekte edilir. Dependency enjection’ı hatırla
IApplicationBuilder interfacei ile kullanılıyor
Configure da enjekte ediliyor
app.usemvc ile enjekte ediyoruz
zaten .net core neye ihtiyacın varsa onu kullan şeklinde çalışıyor
.net core bu yüzden daha performanslı neye ihtiyacın varsa onu gerçekliyorsun
post request pre request begin request authenticate session arka arkaya sırasıyla çalışan bloklar
eski asp.net de pipeline vardı
sen bir istek uyguladığında sırasıyla bazı yerlerden geçiyordu
useMvc()
mvc middleware’i kullanmış
apileri burada yazabiliyor
controller aksiyon action restultlar ne anlama geliyor
bunları yapan middleware
mesela istekte bulundum auth süreci istiyorum mvc den önce
giriş yapacak
kontrol edecez
rol verecez ve authorite filter vasıtasıyla kullanabileceğiz
usemvc den önce middleware yazman lazım
configure içindeki middlewareler sırasıyla çalışır
request delegaiton
bir middleware çalışttığında şimdi sonrai middleware’e geçebiliriz
ne ise o çalışsın diyen mekanizma
hangi sırayla yazarsak o devreye girer
1- invoke imzasına sahip bir method lazım ki async task olarak yazılır
2- HttpContext e ihtiyacı var yapılan istekten header bilgilerini çekeceği için
aspnetcore.http
delegeler zincir şeklinde çalışıyor
bir sonraki delegeye geç komutunu vermek adına
request delegate ihtiyaç var
.net aydınlanmaları
Complex tip joinlenmiş tip demektir ve bunlar da diğer entity’ler gibi entities katmanında yer alır.
CRUD işlemleri yani ORM implementasyonlarının hepsi DataAccess katmanında olur
log cache transaction validation role based security orm vs core’da
EntityFramework.Core Temel Meseleler
İhtar:
Bu makale yazarının kendisi için konu hakkında bir toparlaması ve faydalı olan bilgileri kendine yazmasıdır, bir ana kaynak değildir. Bilgileri konu hakkında geçerli kaynaklar ile karşılaştırıp alınız. Henüz tashih edilmemiştir deneme aşamasındadır.
Veritabanı erişim tarihçesi
ADO.NET
sql cümleciğini yazıp bağlantı açıp kapatmak usingler tüm kontroller bana aitti. ve bir where sorgusu dahi uzundu.
Entity Framework: SQL ile backend Modellerini birbiriyle direkt ilişkilendirmek için bir ara çatıdır. Model class ları ile veritabanı tablolarını eşleştirir. Bir ORM dir object relational mapping.
Entity framework gibi orm ler olmasa ve biz veritabanına bağlı nesne yönelimli bir proje yapacak olsak kod tarafında class ları ve db tarafında ilişkili nesneleri kendimiz oluşturup bir de bunları ilişkilendirecek sql kodlarını da kendimiz yazmamız gerekirdi oysa ORM kullandığımızda ya kod tarafında ya db tarafında bir kere tabloları — sınıfları oluşturuyoruz ve orm sayesinde diğer kısmı auto generate ediyoruz. Otomatik oluşturuyor.
uygulama ile veritabanı arasında bir katman
uygulamadan veritabanına veri taşıyabilir veritabanından uygulamaya veri taşıyabilir
dotnet core da entity framework kullanacağımız zaman yazacağımız komutların anahtar kelimeleri öncelikle
dotnet ef dir
dotnet ef -h
dediğiniz zaman
karşınıza temel 3 komut çıkar
commands:
database
dbcontext
migrations
Öncelikle şunu bilmeliyiz
Entity Framework kullanımında iki yaklaşım vardır
bunlar;
dbfirst: dbdeki tabloları sütunları uygulamaya taşımak hatta store prosedure de view de taşınabilir
codefirst
MODEL FİRST uml diagramları gibi entity frameworkte mouse ile modelini oluşturuyorsun sonra ef bu modelden hem kodları hem dbyi yazıyor
eğer code first kullanacaksak evvela oluşacak class ları yani db entity nesnelerini oluşutururuz
sonrasında bir db context sınıfında tablo olacak sınıfları belirtiriz ve migrations ı kullanarak veritabanına bir göç oluştururuz.
dotnet migrations add init
bunu yaptığımızda migrations klasörü altına bazı kodlar gelir ve bu kodlar çalıştığında veritabanında değişiklik yapacak kodlardır ilk önce buradan kontrol edebilirsiniz demek oluyor bu.
migrations kodları tamamsa artık bu classları veritabanına taşıyacağız bunun için de dotnet ef komutlarından biri olan
database i kullanacağız
dotnet ef database update
dediğiniz zaman yazılan sınıflardan oluşturduğunuz migrations kodları ile veritabanında tablolar oluşmuş olur ve context nesneniz ile veritabanı fonksiyonlarını da gerçekleştirebilirsiniz.
dotnet ef de
database ve migrations komutlarını code first yaklaşımında kullanabilirsiniz.
Bir diğer seçenek de dotnet ef dbcontext
var olan veritabanının bilgilerini girerek scaffolding yapabilirsiniz yani var olan veritabanındaki tabloların entity nesnelerini oluşturabilirsiniz.
buradaki scaffold u kullanabilirsiniz
linq
kümeler harici. bulma yolları
ve algoritma karmaşıklıkları
VSCode ile .NET Core Katmanlı Yapı Oluşturmak
Katmanlı Mimari denilen “Layered Architecture”
.NET’de oluşturacağınız mimarinin katmanları bir çözüm dosyası yani “solution” içerisinde yer alır.
Mesela iş kurallarının “business logic” bulunduğu Business Layer
Ve ya veriye erişeceğiniz yani veritabanı ile iş katmanının arasındaki Data Access Layer “Veri Erişim Katmanı” gibi tüm katmanlar bir çözüm dosyası içerisinde olacak.
Demek ki bizim bir solution’a ihtiyacımız var bunu Visual Studio kullananlar daha önce add new solution diyerek arayüzden yapmıştır.
Biz ise şimdi bunu dotnet CLI ile nasıl yapabiliriz ona bakacağız.
Şu Durumda Klasör Yapım Böyle
- Bir çözüm dosyası oluştur.
dotnet new sln
komutu ile bir çözüm dosyası oluşturabiliriz ve bu üst klasörün ismini alır eğer özel bir isim vermek istersek
dotnet new sln -o app
komutu ile çözüm dosyasına isim verebiliriz, şimdilik üst klasörün ismini alacak şekilde oluşturalım.
klasör yapımıza bir sln dosyası eklendi
ve içerisinde çözüm dosyası ile ilgili bilgiler var henüz herhangi bir proje eklenmemiş biz katmanları oluşturdukça buraya katmanları ekleyeceğiz ki çözüm dosyası içerisinde nelerin bulunduğunu bilsin.
app.sln dosyası
- Bir çözüm dosyası oluştur.
- Bir katman oluştur.
dotnet new classlib -o app.lib -f netcoreapp3.0
“-o” ile katmana isim verirken “-f” ile framework bilgisini yani .net core’un hangi versiyonunda çalışacak o bilgiyi veriyoruz.
katman eklendikten sonra klasör yapısı
Şuan dikkat edilmesi gereken konu şu ki app.sln değişmedi yani şuan solution app.lib katmanını tanımıyor. Solution’a katmanı ekleyelim.
- Bir çözüm dosyası oluştur.
- Bir katman oluştur.
- Katmanı çözüm dosyasına ekle.
dotnet sln add app.lib/app.lib.csproj
bu komutu yazdıktan sonra app.sln dosyasına baktığınızda değişiklik olduğunu göreceksiniz.
katman çözüm dosyasına eklendiğinde çözüm dosyasının değişen bir kısmı(alt kısımlarda da başka eklemeler olduğunu görebilirsiniz)
Bu noktada bir ek yaparak projemize newtonsoft json kütüphanesini dahil edelim bu opsiyoneldir dotnet restore komutunu da kullanmayı görmek için ve paket dahil etmeyi de işlemek için ekledik.
dotnet add app.lib package Newtonsoft.Json
bu kodu çalıştırdığınızda ve app.lib.csproj dosyasına baktığınızda bu nuget paketinin projeye dahil edildiğini göreceksiniz.
app.lib.csproj dosyasına nuget paketi eklendi
Biz şimdi projeyi sıfırdan oluşturduk ve paketimizi ekledik ama siz var olan bir proje üzerinde çalışabilirsiniz ve bağımlı olduğu paketleri kontrol edip projeyi çalıştırmak için paketleri dahil etmek isteyebilirsiniz işte bunun için dotnet restore çalıştırıyoruz.
dotnet restore
- Bir çözüm dosyası oluştur.
- Bir katman oluştur.
- Katmanı çözüm dosyasına ekle.
thing.cs
dotnet build
diyerek kodunuzu derleyebilirsiniz.
Kodu build ettikten sora klasör yapınıza bakarsanız app.lib altında bir bin klasörü oluştuğuu ve burada bir .dll dosyası olduğunu göreceksiniz. Katmanlı yapının ilk kısmını oluşturduk ve çalışıyor.
Şimdi ise bir test oluşturalım
dotnet new xunit -o app.lib.test
Testi solution’a dahil edelim
dotnet sln add app.lib.test/app.lib.test.csproj
Test sınıfımızı düzenleyelim
Klasör yapımıza bir bakalım
dotnet build dediğimizde çalışmadığını göreceksiniz çünkü henüz test katmanımız lib katmanımızı tanımıyor.
dotnet add app.lib.test/app.lib.test.csproj reference app.lib/app.lib.csproj
test katmanında lib katmanına erişeceğimiz için referans verdik, artık app.test/bin kısmına baktığınızda app.lib de olduğunu göreceksiniz. Şimdi ise testi çalıştıralım
dotnet test app.lib.test/app.lib.test.csproj
Test sonucumuz:
Bir de konsol uygulaması ekleyelim
dotnet new console -o app.console
Konsol katmanını solution’a eklememiz gerekir.
dotnet sln add app.console/app.console.csproj
ve yine konsol katmanında lib katmanını da kullanacağımız için onu da eklememiz gerekir.
dotnet add app.console/app.console.csproj reference app.lib/app.lib.csproj
burada add ve reference kısımlarının görevlerini şöyle düşünebilirsiniz
dotnet add [target project(hangi projede kullanacaksın)] reference [destination project(neyi kullanacaksın)]
dotnet run -p app.console/app.console.csproj
şuan klasör yapısı
VSCode’da hata ayıklamak için debugger’ı kullanabilirsiniz bunun için .vscode kısmında launcj.json ve task.json dosyalarınız olmalı ve aşağıdaki gibi düzenlenmelidir.
task.json
launch.json
NOT : Eğer _GenerateRestoreProjectPathWalk hatası alıyorsanız sln’e reference eklemediğinizden olabilir.
Visual Studio gibi gözüksün istiyorsanız VSCode’a vscode-solution-explorer eklentisini kurabilirsiniz.
vscode-solution-explorer eklentisi ile klasör yapısı görüntüsü
Neredeyse tüm yazıda şuradan faydalanılmıştır:
https://softchris.github.io/pages/dotnet-core.html#adding-and-using-our-library-project
Kod Okuma Rehberi
DAL : data access layer, veri işlerini veritabanı operasyonlarını burada yazar, CRUD IUDS
Test : yazılan operasyonların test edildiği kısımlardır.
Manager: business layerda (iş katmanında) bulunur temel operasyonları gerçekleştirir
Utilities : Araçlar demektir mesela string url dönüştürme işlemleri vs buradadır.
Tasarım Desenleri
dependency inversion der ki bir katman diğerini new leyemez
bu yüzden dependency injection var
servis tabanlı bir mimaride gitmeliydi
IoC invertion of control
ioc container soyutu ve somutu veriyorsun factory deseni
DependencyResolvers
ninject
autofac
lite inject vs dire ioc
factory → fabrika → instance oluşturma deseni
factory’den önce singleton öğrenilmeli
düzensiz çalışsan bi süre sonra uygulamadaki kontrolü kaybedersin
entity depar nhibernate
generic repository
der ki: tüm entitylerin için ortak olan methodları bir yerde topla
getall
getbyid
remove(id)
add(t)
unit of work
tüm database işlemlerini yönetir
class lar property olarak
ram de meydana gelen değişiklikleri db’ye aktar
ddd
domain dal ui
generic repository pattern
singleton design pattern
bir nesne örneğinden sadece bir kere üretilecek ve bu örnek her zaman kullanılacak.
hedef: bir nesnenin örneğinin ve örnek değerinin bir çok kullanıcı tarafında değiştiğinde aynı şekilde kullanılması
web sitesine anlık giren ziyaretçi sayısı kaç?
herkes aynı değeri okur veya günceller
nesne state’i kontrol edilmesi hedefimizdir bunun için singleton kullanırız
bir nesne örneğini katmanlat arasında geçiyoruz ve nesne bir değeri tutmuyor sadece işlem yapıyorsa yine singleton olsun isteriz
is katmanındaki bir manager nesne ekleme silme güncelleme arama yapıyor değer tutmuyor
resim ekleme vs methodu mesela
bin kullanıcı business’a her istekte bulunduğunda yeniden new’lenir
try catch ve new’lemek pahalı işlemlerdir
ne zaman kullanmamalısın?
singleton ile ürettiğinde o bellekte hep sabit kalır
singleton manager nesnesi ürettiğinde iis’i restart etmezsen ve nesnenin ömrünü başka bir şekilse sonlandırmadıysan bu nesne hep bellekte duracak
herkes bu nesneye erişecek
herkes bunu kullanacak mı?
bir nesneyi ürettin ve uygulama boyunca bir kullanıcı bir kere istiyor ve günlerce kimse istemeyecek nadir kullanılıyorsa işlem bittiği zaman nesne ömrünün bitmesi daha iyidir bellekte yer işgal etmesin
ihtiyaç olduğunda tekrar üretilebilir
- create a private constructer
- create a static instance maker method — if exists a instance from this class dont new instance create just return existing instance
- create a static property for manage
biz genelde her iş katmanında singleton üretecek kodu yazmayız onun yerine factory dp ile ortak çalışma gerçekleştirerek direkt o factory üzerinden nesne üretimi gerçekleştirilir
ioc container revaçta değilken kendileri yaparlarmış artık o factory üzerinden singleton üretiyor
ninject
cassol vinsor
structure mapping unity vs ioc containerlar bunu yapıyor
bana bu instance’ı singleton üret diyoruz
bu containerları kullanınca bu kodu yazmayız
thread safe singleton
multi thread çalışıyorsa bir nesneyi aynı anda iki kullanıcı isterse çok istisnai bir durumdur
iki kullanıcı nesne istiyorsa ve hali hazırda nesne yoksa ikisi de newlemeye çalışırsa olay karışır
safe programming defensive programming
ioc container kaynak kodlarında bu koruma implementasyonları var
nesne kilitleme
lock yapacak dummy nesne
üretim varken ben burayı kilitlemek istiyorum
scope safed çalışıyor lock
şimdi factory’e çıkıyoruz
günümüz design patternlerinde en çok kullanılan
yazılımda değişimi kontrol altında tutmak
veri erişim katmanındaki orm cache log systemlerde değişlenlik ve farklı teknik implementasyonu
kendi iş nesnelerin de öyle
- bir fabrikan var
- temel bir methodda logger üreteceksin
- create logger
Razor Pages
Razor pages, code behind yani görünüm dosyanızı bir backend C# kodu ile beslediğiniz bir yapıdır. Bu noktadan single page aplicaitons dediğimiz vue, angular, react uygulamalarına benzer.
dotner core’da bir razor page oluşturduğunuzda bir cshtml dosyası yani içerisinde @ ile C# kodu yazabileceğiniz bir razor sayfası ve bu sayfanın modeli olan yani bu sayfayı besleyebileceğiniz verileri oluşturan cshtml.cs dosyası bulunur. Bu durumda controller kullanmadan bir sayfa oluşturmuş olduğunuzu düşünebilirsiniz. Haklısınız.
Razor sayfasını besleyen sayfa bir page model sınıfıdır dolayısıyla page modelden kalıtım almalıdır.
ve bu sınıfın içinde OnGet isminde bir method vardır bu sayfaya get isteği yapıldığında çalışır yani sayfaya her istek attığınızda ilk bu method çalışacaktır dolayısıyla javascript’teki load metodu gibi düşünebiliriz.
Şimdi biliyoruz ki bir görünüm sayfamız var ve bu sayfamıza bazı veriler göndereceğimiz için razor’dan alışkın olduğumuz üzere Model’imiz var.
Yani sizin page modelde tanımladığınız her property yani sınıf değişkeni aslında görünümünüzde Model. diyerek erişebileceğiniz bir alandır.
Component
Docker ile .Net Core
Bir .net core console uygulaması oluştutuyoruz
dotnet new console — name console101
dizine gidiyoruz
cd console101
vscode ile açıyoruz
code .
şimdi bir docker dosyası oluşturmamız gerekiyor
uzantısız ve ismi dockerfile olan bir dosya oluşturun
ilk satırım
FROM mcr.microsoft.com/dotnet/core/sdk:3.1.102
bu benim için gerekli olan tüm paketleri hazırlayacak yani altta yatan görüntü
ikinci satırım
WORKDIR /src
hangi klasörde çalışacağımı söyler
elimde hazır çerçeve var fakat benim uygulamamı nasıl buraya atacağım? bu durumda projemi buraya kopyalamalıyım
üçüncü satır
COPY . .
iki nokta nereden -> nereye manasına geliyor
source dest
dördüncü satır
ENTRYPOINT [“dotnet” , “run”]
yani uygulama çerçevesini oluşturduk projemizi de yükledik ama ne yapacağız nereden başlayacağız?
şimdi bunu inşaya geliyoruz
dotnet build -t console101 .
şimdi image oluştu bunu çalıştırabilirsiniz
docker run console101
.net core web api with postman
hi! this tutorial about use postman with .net core api
first, you should a .net core api project
so, u can this command in command line and run after you see this project is created.
dotnet new webapi -o TryPostman
cd TryPostman
code .
so vscode is opened
right,
Katmanlı Mimari
Yazılım mimarisinde olan her gelişme karmaşıklığı bir derece daha azaltmıştır ve azaltmak içindir.
Projeler büyüdükçe karmaşıklaşıyor, karmaşıklaşan proje ele alınamaz handle edilemez hakimiyeti zor idaresi zor değişiklik yapması ve implemente etmesi zor hale gelir bu zorluklardan kurtulmanın çaresi yaklaşımı ve mimariyi değiştirmektir.
Belki fazla kodunuz satır sayısı olarak yok ama eğer mimarinizi değiştirirseniz yönteminizi yaklaşımınızı değiştirirseniz daha kolay yazılır, okunur, değiştirilir, geliştirilir bir kod yazmış olursunuz.
Karmaşıklığı azaltmanın yollarından biri kısımlara modüllere ayırmaktır ve sonra bu modüller birbirini beslerler.
Şema çiziyoruz, model oturtuyoruz, inşa ediyoruz, planlıyoruz.
Planlarken katmanlı mimari daha işimize geliyor.
- Kod karmaşıklığını azaltmak
- Kod okunurluğunu artırmak
- Kod değişimini kolaylaştırmak
- Performans ? (Clean Code’dan uzaklaşılmış oluyordu.)
- Hatayı alıp ayıklamak ve nereden çıktığını sezmek zorlaşıyordu.
- Sınırları belirlemek kısımlandırmak parçalamak her zaman sezmeyi kolaylaştırır tesbit etmeyi noktayı bulmayı kolaylaştırır
- Classlar çok iç içe olduğu için çıkabilecek hatayı sezmek zorlaşıyordu. (herkes birbirinin işine karışıyordu)
- Demek bu class library iştirak-ı emval düsturudur.
- Genişletilebilir olmuyordu nereye dokunsanız patlar şeklinde bakılıyordu.
- Aman koda dokunmayalım şurasını ellemeyelim diyordu çünkü herşey birbiri ile çok bağlı idi
- Sanki her biri bir birey olarak tek başına hareket eden kodlar yazacağız
- genişletilebilir ve esnek
.net core
cross platform macosx de linuxda microsoftta kışabilr
daha çok kullanıcıya erişmek
sunucu performans ve maliyet
lisans maliyeti
farklı yazılım geliştirme stillerini desteklemesi
istediğiniz scripti derleyebilir ve daha az kaynak kullanarak farklı farklı idelerde geliştirme yapabiirsiniz
yazılımın dağıtılması konusunda esneklik
.net core kurulum yapılan makinada mevcud olmasına gerek yok
microservice yapılarına uygunluğu
modüler ve az kaynak kullanan bir yapısı olduğu için
microservice mimarisine daha elverişli
Kod neye göre modülerleştirilir?
aldığı vazifeye göre kodu modülerleştirebiliriz
yaptığı işe göre sınıflandırma
kodların üstlendiği görevlere göre ayrı ayrı projelere yani class library lere dönüştürme işlemidir
Çıkabilecek hatalar için nokta atış hedef belirlenebilmesi
Mesela veri ile alakalı data ile alakalı çekmek gibi add gibi burada bir logicin olmaması gerekiyor.
bu logicin iş katmanında olması gerekiyor.
Sorular
Katmanlı mimari nedir?
Katmanlı mimarinin ingilizcesi nedir?
Kaç yılında neyin üzerine çıkmıştır? ihtiyaç ne zaman hissedilmiştir?
Mimari Nedir?
proje mimarı yazılım mimarı nedir?
katman nedir? taban değildir taban base temel taban
katman layer demektir aslında adobede var ve kurtarıcı
Katmanlı → Yani bir tabanda değil birbirinden soyutlanmış farklı tabanlarda ama birbiriyle haberleşerek neyin nerede olduğunun daha anlaşılır olduğu bir kodlama tekniğidir.
Mimari → Mimarlar evin planını çizerler yapılar bu planın somutlaşmış halleridir. Kodun nizamını bunlar belirler böylece kod intizamlı olur.
Katmanlar nelerdir?
Business
DAL
Entity
VScode
platform bağımsız çalışan ide
CLI NEDİR? birçok farklı farklı platformu kullanabiliyorsun
entityframeworkte de microservice mimarisi vardı
coreda geliştirildi daha elverişli oldu
asp.net core mvc
middleware nasıl yazılır?
eklenti nasıl yazılır
servisleri nasıl implemente edeceğiz
class ve implement
SignalR
RealTime Web
SignalR ismindeki R realtime’ın R si olabilir.
office365’in altında olan bir teknoloji
signalr js tarafında jquery bağımlı bir kütüphane
kütüphanedir
owin open web interface sunucu ile uygulama arası katmanı
signalr owin üzerinden çalışıyor
owin ve jquery bağımlı
http tabanlı bir yapıdır
host edince http olur, api içinde kullanabilirsin
Remote Procedure Call
- Web Socket ( HTML 5 ile geldi. )
- Server Sent Events
- Forever Frame
- Ajax Long Pool
Fallback
- Geri çekilme
- Alternatif plan uygulama
- B planı var signalR’ın
Web Socket ile Uygulama Arası Arayüz → SignalR
Poolingte
veri kaçırma, mesaj kaçırma ihtimali var
signalR arkada bufferda tutarak bu ihtimali de azaltıyor
ne kadar timeout olsa da
Performans
- snde 30.000 mesaj alıp verme
Forever Frame
- Web sayfasına bir pixel kadar bir iframe ekleyip çok düşük bir interval ile tekrar tekrar server’a bana bir şey var mı diye sormaktır.
- sunucudan gelen js hooklarını tekrar tekrar execute ediyor
- sadece IE
Server Sent Events
- Protokol değiştirmeden yine HTTP ile
- datayı tarayıcıya push etme
- Bana bi şey var mı sorusunu browser’a sorar
soru : web socket, http üzerinde çalışmıyor mu? tcp üzerinde mi çalışıyor? web socket farklı bir protokol mü?
ilişki: node.js deki socket.io .net deki signalR
soru: signalR ile ws: bir uzantı oluşturabilir miyim? eğer ulaşabilirsem flutter’dan web socket bağlantısı yaparım.
deep dive
redis ile scale edebiliriz
onesignal bildirim push notification yapııs free mit licence
Interface Nedir?
Interface, somut sınıflara implemente edilebilen soyut yapılardır. Harici bir varlığı vücudu yoktur new’lenemez yalnızca new’lenebilecek olan sınıflara implemente edilebilir. Sınıfların ortak özelliklerini kapsar. Böylece bir çok sınıftaki aynı method ve propertyleri ortak bir kısımdan kontrol etmiş oluruz. Interface’in her property ve methodu implemente edilen sınıfta olmalıdır. Aksi halde hata verir.
Interface method ve propertylerinde public, private, internal gibi erişim belirteçleri kullanılmaz sadece methodun imzası yazılır. Implemente edildiği somut sınıfta bu belirteçler kullanılır ve imzası yazılan methodun gövdesi yazılır.
Aslında C#’da çoğunlukla interface’leri kullanıyoruz. Siz de muhakkak kullanmışsınızdır. Bunlardan bir tanesi çok aşina olduğumuz
IEnumerable
başka bir tanesi
ICollection
MVC yazanlar hatırlayacaktır, başka bir tanesi de
IActionResult
farkındaysanız hepsi I harfi ile başlıyor bu bir isimlendirme standardıdır.
IEnumerable’ı new leyemezsiniz
IEnumerable list = new IEnumerable();
Mesela üstteki kod bir katliamdır 🙂
Fakat ne yapabiliriz
IEnumerable yani sayılabilenlerin bulunduğu interface
IEnumerable array = new string[];
evet array de ienumerable dan implemente edilmiştir.
peki ICollection?
O da sadece koleksiyonları içermektedir yani
ICollection collection = new List<> yapabilirsiniz mesela
bunu her tip özünde object olduğu için her değeri var keywordüne atayabilmemiz gibi düşünebilirsiniz. Daha soyut yani sınırları daha geniş ve şeffaf soyutlaştıkça nuranileşir ve hepsini bilir artık her şeyin özü odur gibi..
İnterface’ler neden kullanılır?
Temel operasyonları oluşturup bunu implemente etmek için
Mesela service ler interfacelerdir.
tüm silme methodları aynıysa bir interface oluşturulabilir hatta bu interface generic bile olabilir. Böylece daha dinamik bir yapı elde edilir.
Mesela bir projede hem postgresql hem sqlite hem mssql için veritabanı operasyonlarını implemente edeceksiniz.. bunların hepsi ICustomerDAL interfaceinden implemente edilen somut sınıflar olsa siz bir değişiklik yapacağız zaman sadece ICustomerDAL kimi instance almış bunu değiştirerek kodun başka hiçbir yerini ellemeden veritabanı teknolojinizi değiştirip işlem yapabilirsiniz.
Uygulama bağımlılıklarını azaltmak için interfaceler kullanılır katmanlar arası geçişte
Polymorphisim için interface
bir customerdal yapıp
gerçek hayat1
isqlcustomerdal
ioraclecustomerdal dan implemente edip
cııstomermanagerdan hangisini kullanmak istiyorsak onu çekebiliriz
gerçek hayat2
tüm db lere aynı anda kayıt istiyorsak
bir arrayde tüm dblerin dalından newleyip
foreach ile bu instanceleri döneriz
bu arrray ICustomerDal arrayi olacak tabi
ICustomerDAL newlenemez ama array olabilir
interface can able mantığı
worker: iwork , ieat , isalary
robot: iwork
manager: iwork, ieat
iworke eat work salary yazsaydık robotta eat boş kalacaktı
SOLID prensipleri
I →interface segrigation için iwork ieat ve isalary
Interface temel
Neden Interface kullanıyoruz?
Gerçek hayatta interface1
gerçek hayatta interface2
çoklu implementasyon
kalıtıma giriş
interface mi inheritance mı?
virtual methodlar
abstract classlar
Katmanlı Mimari Jump Start
DataAccess DAL
Business BAL
Entities
Core Entities
MVC
ASP.NET CORE
BEST PRACTICE
- Blank Solution Oluştur → Firma adı ile
- FirmaAdı.Core
- FirmaAdı.ProjeAdı.Entities
- FirmaAdı.ProjeAdı.DAL // DLL // DataAccess
- FirmaAdı.ProjeAdı.Business // BLL // Bİ EY EL
- FirmaAdı.ProjeAdı.MvcWebUI
Entity Katmanının Oluşturulması
Proje nesneleri , veritabanı tabloları, kompleks nesneler
- Entites Katmanına Gel
- Class1.cs sil
- Concrete klasörü oluştur (bu somut nesnelere karşılık gelir)
- ComplexTypes klasörü oluştur
- Concrete altında User.class gibi somut bir sınıf oluştur
- User : IEntity olsun
- IEntity bu firmanın veritabanı nesnesini anlattığı için Core altında tanımlayalım
- Core Katmanına gel
- Entites Klasörü aç
- IEntity interfaceini oluştur
- User IEntity den implemente edilsin ve ben artık bileyim ki User bir veritabanı nesnesidir
- Core’daki IEntity’i Entity katmanı görmez entity katmanına gelip add reference yapmalısın
- Data Access Layer sadece veritabanı işlerimizi yaptığımız katmandır (CRUD) SQL komutlarının çalıştırılması gereken yerdir, ilgili dataya erişmek için gerçekleştirilen operasyonlardır. İş kodu buraya yazılmaz. Transection burada yazılmaz. Burada tek bir birimi uniti çalıştıracağız işlerimizi iş katmanında çözeceğiz
- DLL’de iki klasör oluşturulur, biri abstract biri concrete, concrete somut nesnelerdi. entity framework ile ilgili işlemde kodu buraya yazacağız. abstract ise iş katmanın iletişim kuracağı katmandır. iş katmanında veri erişim katmanına erişmek için katiyen concrete sınıflar kullanılmaz abstract üzerinden haberleşilir. entity framework koduyla gitmiyoruz abstractla yani interface ile gidiyoruz.çünkü yarın öbürgün entity framework kullanmam başka bir dal başka bir orm’e geçebilirim. bu tüm katmanlarda lazım. soliddeki d dir dependency inversion → üst katmanlar (DAL en alt katman) mesela business bir alt katmanla yani Dal ile direkt irtibat kuramaz. business hiçbir zaman DAL’ı newleyemez
- REPOSITORY ARAYÜZÜ OLUŞMASI
- tüm nesneler için neredeyse crud var biz veri erişim katmanında bunları bir kere yazmak için bir veri erişim deseni oluşturuyoruz(Generic Repository Pattern) generic olacağı için tüm projelerimizde kullanabiliriz demek ki .Core kısmında olmalı
- Core katmanına git dataaccess diye bir klasör oluştur.
- IEntityRepository interfaceini Core/dataaccesse koy
- IEntityRepository Generictir T alır
- generic constraint koyarız
- T class olacak yani referans tip olacak , IEntityden implemente yani ancak veritabanı nesnesi yazabilelim ve newlenebilir yani abstact ve interface olmaz, class referans tip demektir class diyince interface ve abstract da alır new ile interface ve abstract almasını engelliyoruz yalnızca class alsın, IEntity → ilgili T bir veritabanı nesnesi olsun çünkü CRUD orada
- Linq Expression olarak geçmek bir tane link fonksiyonu geçecek
- bu aslında filtre where geleceği için mi return type bool?
ben get ve getlistte bir tabloda ne expression yazarsam hangi türden sorgu gönderirsem select ile alakalı veritabanına o sorguyu generate edip o sorguyu basacak.
belki yüzlerce sorgu yazmaktan kurtarıyor burada proje ile alakalı hiçbirşey yok o yüzden core katmanında
- Tüm projelerim için bir tane Entity Framework Repository implementasyonu yazmak istiyorum
- IEntity herkes kullanabilir ama EF herkes için değil bir tık özel
- Core altına teknoloji ismi vermek gereklidir.
- EntityFramework klasörüne EfEntityRepositoryBase yazıp IEntityRepository implementasyonu yapıyoruz
- Entity Frameworkle çalışabilmek için bir context lazımdır bir de entity lazımdır
- TEntity aynı generic constraint
- TContext ise EFCore indirip onun DbContexti olmalı
- IDisposable using açarsın
- demek ki context’e TEntity i set ile verebiliyorum
- ef state ile ne yapması gerektiği anlaıyor added ise ekliyor modified ise hmm değiştireceğim demek ki diyor
Entity framework power tools mevcud, kendin de yazabilirsint
devartın ürünleri var
bu tip code generatorlar kullanılabilir
Devart →entity generation araçları
Nesne çıplak duruyorsa bundan biraz çekinmelisin
ilerleyen zamanlarda nesnellik zaafiyeti getirir
dal
abstract
2 interface
ISurveyDAL : IEntityRepısitory
ICriterionDAL
dal’a core ve entities reference eklenir
Iproduct dal ın özel methodları operasyonları olabilir diye
iproduct custom operadtion iproductdalda
ayrıca yazıyoruz yine de
stored precedure yazılabilir
view üzerinden çalışmak istiyorsun?
join
entity framework data access layer dışında bir yerde kullanılmamalıdır.
şimdi interface’in concreteleri
ef ile alternatifi olan bir araç bir teknoloji kullanıyoruz
demek ki concretede bir klasör
ef
business layer
abstract
concrete
dal kodu burada yazılmaz ef burada çağırılmaz
- bizim dal arayüzünü çağırmamız gerekiyor
- arayüz kodları session nesneleri burada olmamalı burada çağırılmamalı o mvc kısmında asp.nete özgü arayüz kodu
cache
loglama
güvenlik
validation
C# PDF
pdf okutma
forms → tool box → right click → choose component new items → adobe pdf reader →
using system.io
openfiledialog → dosya penceresi aç
.net iTextSharp.dll referance ekle
.net iTextSharp.dll
using itextsharp.text.pdf
itextsharp.text.Document raporum = new..
pdfwriter .getinstance(raporum , new filestream(“c:deneme.pdf” , filemode.create))
add author
add cart
add curt
if(raporum.isopen() ==false)
raporum.open())
raporum.add(new paragraph(ds))
reporum.close
try carch veya message box eklenebilir
bin debug içine oluşturdu
neden c de değil??
excel ile bağlantı kurabilirim
wordle de yarın inşaallah
ASP.NET Core MVC Nedir?
Öğrenilecek Terimler
developer , platform , Framework , MVC , Tasarım Deseni, .NET, ASP.NET, ASP.NET Core
Programlama dilleri ve kütüphanelerini birlikte barındıran yapılara developer platform denir. .NET de böyle bir platformdur. Bu platformda Visual Basic, C# , F# gibi diller kullanılabilir. Microsoft’un geliştirdiği temelde üç platform vardır.
Bunlar .NET , Windows üzerinde çalışan websiteler, servisler ve uygulamalar geliştirilebilir
.NET Core , windows, linux,macos da çalışabilen websiteler servisler uygulamalar geliştirilebilir
Xamarin/monodur mobile için .net dir
Temel bir proje iskeleti sağlayan, tekrarlayan işlemleri kolaylaştıran teknikleri barındıran yapılara uygulama çatısı denir. (bkz: framework)
ASP.NET de böyle bir uygulama çatısıdır. Her uygulama çatısını başlatanlar, geliştirenler, sonrasında oluşan topluluklar ve destekleyicileri olduğu gibi .net çatısının arkasında da Microsoft firması vardır.
ASP.NET çatısı proje kaynak kodlarını sadece kendi geliştiricisi görebilen ama kullanımı umuma açık bir framework iken ASP.NET Core yine Microsoft’un başlattığı aynı zamanda kaynak kodlarını da umuma açtığı olduğu yani açık kaynak kodlu bir framework’tür. Bununla birlikte ASP.NET Core çatısının ASP.NET’e göre performansı daha yüksektir.
Yani ASP.NET Core bir frameworktür. Tabi ki framework bir iskelet, bir tasarımdır ve işlem yapabilmek için bir programlama diline ihtiyacı vardır. ASP.NET Core çatısında C# dili kullanılır.
MVC ise bir tasarım desenidir.
Dolayısıyla ASP.NET Core MVC,
ASP.NET Core frameworkünde MVC tasarım deseni kullanılarak C# diliyle uygulama geliştirilebilen bir yapıdır.
ASP.NET Core MVC Temel Proje Yapısı ve Temel Dependency Injection
Bu komut bulunduğunuz dizinde .net core platformunda mvc tasarım deseni ile oluşturulmuş c# dili ile yazılmış bir iskelet oluşturacak.
Bu projeyi VS Code editörü ile açabiliriz.
Controllers
Models
View
Program.cs de server ayarı yapılıyor
Startup ise uygulama ayağa kalktığında oradan çalışmaya başlıyor.
Biz Service klasörü oluşturalım ve controllerı bu şekilde db den uzak hale getirelim
Dependency injection
.net core ile excel dosyası okumak
Bir excel dosyası okumak için temelde aşağıdaki adımlar izlenmelidir.
- Excel dosyasını al
- Dosyasını isimlendir ve bir klasöre koy
- Excel okumak için ilgili kütüphaneleri araştır ve birisini seç
- Dosyasını oku
Senaryo:
Sözlük uygulaması yapıyoruz ve bazı kelime ve karşılıkları bir excel dosyasında var. Bizim bu verileri çekip veritabanımıza aktarmamız gerekiyor. Tabii bunun için önce Excel dosyasını okumak gerek.
Önce excel dosyasını okuyup alınan bilgileri veritabanına aktarabiliriz. Şimdi excel dosyasını okumaya odaklanıyoruz.
Excel dosyamız aşağıdaki gibi:
Dictionary.xlsx dosyasında
Dictionary sheetinde
A ve B sütunlarında başlık ile birlikte 7 satır var.
dotnet new console -o ExcelRead
komut satırı ile ExcelRead adında konsol projesini oluşturduk.
Excel dosyasını proje klasörüne yerleştirdik.
şimdi ise nuget paketlerinden excel okumak için bir kütüphane arıyoruz.
OpenXML kütüphanesinin uygun olabileceğini düşündük ve paketi projemize dahil ediyoruz.
dotnet add package DocumentFormat.OpenXml.DotNet.Core
projeye kütüphaneyi dahil ettik.
.net core Authentication (Oturum Yönetimi)
ASP.NET Core Temel Proje Yapısı projesinden devam ediliyor anlamadığınız nokta olduğundan bu makaleyi ziyaret edebilirsiniz.
.net core identity kullanılmaksızın cookie authentication ile oturum açma işlemi
Claim nedir?
Öncelikle cookie için gerekli paket yüklenmelidir.
dotnet add package Microsoft.AspNetCore.Authentication.Cookies --version 2.2.0
Startup.cs → ConfigureServices methoduna aşağıdaki kod eklenir.
CookieAuthenticationDefaults için Startup.cs ‘e şu namespace eklenir.
Böylece kimlik doğrulama işlemimde — uygulamanın varsayılan kimlik doğrulama şemasını ayarlanmış oldu —
Artık Cookie Authentication Uygulamammıda Kullanıma Hazır
AccountController diye bir Controller oluşturarak işlemleri oradan yönetelim