dotnet

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.

Kenan yıldırım 1- Entity Framework’e Giriş videosundan alınmıştır

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.

Kenan yıldırım 1- Entity Framework’e Giriş videosundan alınmıştır

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

Kenan yıldırım 1- Entity Framework’e Giriş videosundan alınmıştır

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

http://www.npgsql.org/efcore/index.html

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

  1. 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ı

  1. Bir çözüm dosyası oluştur.
  2. 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.

  1. Bir çözüm dosyası oluştur.
  2. Bir katman oluştur.
  3. 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

  1. Bir çözüm dosyası oluştur.
  2. Bir katman oluştur.
  3. 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


  1. create a private constructer
  2. create a static instance maker method — if exists a instance from this class dont new instance create just return existing instance
  3. 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


  1. bir fabrikan var
  2. temel bir methodda logger üreteceksin
  3. 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.

bu pagemodel’dir
page modelin tüketildiği sörünüm Index.cshtml

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.


  1. Kod karmaşıklığını azaltmak
  2. Kod okunurluğunu artırmak
  3. Kod değişimini kolaylaştırmak
  4. Performans ? (Clean Code’dan uzaklaşılmış oluyordu.)
  5. Hatayı alıp ayıklamak ve nereden çıktığını sezmek zorlaşıyordu.
  6. 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
  7. Classlar çok iç içe olduğu için çıkabilecek hatayı sezmek zorlaşıyordu. (herkes birbirinin işine karışıyordu)
  8. Demek bu class library iştirak-ı emval düsturudur.
  9. Genişletilebilir olmuyordu nereye dokunsanız patlar şeklinde bakılıyordu.
  10. Aman koda dokunmayalım şurasını ellemeyelim diyordu çünkü herşey birbiri ile çok bağlı idi
  11. Sanki her biri bir birey olarak tek başına hareket eden kodlar yazacağız
  12. 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


  1. Blank Solution Oluştur → Firma adı ile
  2. FirmaAdı.Core
  3. FirmaAdı.ProjeAdı.Entities
  4. FirmaAdı.ProjeAdı.DAL // DLL // DataAccess
  5. FirmaAdı.ProjeAdı.Business // BLL // Bİ EY EL
  6. FirmaAdı.ProjeAdı.MvcWebUI

Entity Katmanının Oluşturulması

Proje nesneleri , veritabanı tabloları, kompleks nesneler

  1. Entites Katmanına Gel
  2. Class1.cs sil
  3. Concrete klasörü oluştur (bu somut nesnelere karşılık gelir)
  4. ComplexTypes klasörü oluştur 
  5. Concrete altında User.class gibi somut bir sınıf oluştur
  6. User : IEntity olsun
  7. IEntity bu firmanın veritabanı nesnesini anlattığı için Core altında tanımlayalım
  8. Core Katmanına gel
  9. Entites Klasörü aç
  10. IEntity interfaceini oluştur
  11. User IEntity den implemente edilsin ve ben artık bileyim ki User bir veritabanı nesnesidir
  12. Core’daki IEntity’i Entity katmanı görmez entity katmanına gelip add reference yapmalısın
  13. 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
  14. 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
  15. REPOSITORY ARAYÜZÜ OLUŞMASI
  16. 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ı
  17. Core katmanına git dataaccess diye bir klasör oluştur.
  18. IEntityRepository interfaceini Core/dataaccesse koy
  19. IEntityRepository Generictir T alır
  1. generic constraint koyarız
  2. 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
  1. Linq Expression olarak geçmek bir tane link fonksiyonu geçecek
  2. 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


  1. Tüm projelerim için bir tane Entity Framework Repository implementasyonu yazmak istiyorum
  2. IEntity herkes kullanabilir ama EF herkes için değil bir tık özel
  3. Core altına teknoloji ismi vermek gereklidir.
  4. EntityFramework klasörüne EfEntityRepositoryBase yazıp IEntityRepository implementasyonu yapıyoruz
  5. Entity Frameworkle çalışabilmek için bir context lazımdır bir de entity lazımdır
  6. TEntity aynı generic constraint
  7. TContext ise EFCore indirip onun DbContexti olmalı
  8. IDisposable using açarsın
  1. demek ki context’e TEntity i set ile verebiliyorum
  2. 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

  1. bizim dal arayüzünü çağırmamız gerekiyor
  2. 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.

şöyle temel bir yapı oluşuyor

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.

  1. Excel dosyasını al
  2. Dosyasını isimlendir ve bir klasöre koy
  3. Excel okumak için ilgili kütüphaneleri araştır ve birisini seç
  4. 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

Yorum bırakın