.Net Core Eğitimleri

10- ) Web Api Projesi 1. Kısım

Business Katmanı

Projenin şuana kadar mimarisini oluşturduk, artık web api mizi yani iş katmanımızı kodlayabiliriz. İş katmanı bizim uygulamamızın ne iş yapacağını ve ne senaryolar ile çalışacağını yani işin kendisini kodladığımız yerdir. Bu katman logic ve business katmanı olarak da anılabilir.

Dependency Injection mantığını kullanabilmek adına controllerlarımızın hepsinin ne tür metotlar içereceğini yani metot imzalarını kodlayacağımız interfaceler oluşturacağız. Bunun için web api projesine solution explorer üzerinden sağ tıklayalım ve Interfaces isminde bir klasör oluşturalım. Oluşturduğumuz klasörün üzerine sağ tıklayarak Add –> NewItem diyelim dosya tipimizi Interface işaretleyelim ve Name alanına ILanguageController yazarak kaydedelim.

Controllerların Oluşturulması

Daha sonra ILanguageController.cs dosyasına çift tıklayalım ve içeriğini aşağıdaki şekilde düzenleyelim. Aşağıdaki kodu dikkatli inceleyecek olursanız IApiController Interface inden kalıtım alıyor bu nedenle ortak tüm metot imzaları zaten buraya geleceği için ekstra olarak aynı kodları tekrar yazmamıza gerek yok. Aklınıza neden o zaman bu interface’i oluşturduk sorusu gelebilir, birinci nedeni bu controller içinde farklı ve kendisine özgü metotlar yazabiliriz, ikinci neden ise dependency injection yaparken bu interface üzerinden instance alacağız.

Daha sonra Web api projemiz içerisinde bulunan Controllers sınıfına sağ tıklıyoruz ve Add –> Class diyerek Name kısmına LanguageController yazarak kaydediyoruz. Bu sınıf yukarıda oluşturduğumuz ILanguageController arayüzünden kalıtım alacak. LanguageController.cs dosyamıza çift tıklıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

Yukarıdaki controller içerisinde sadece CheckDublicateLanguage isminde bir metot var geri kalanlar ApiBase üzerinde kodlanmış durumda, api base generic bir sınıf olduğu için içerisine Language entitymizi, LanguageDto sınıfımızı ve Controller’ın kendisini gönderiyoruz. Eğer bu controller diğerlerinden bağımsız bir işlem yapacak ise ya da var olan ortak metotlardan (baseden gelen Add,Update,Delete,Find .. vs gibi) birini override edecek ise sınıfın içerisinde bu kodlamayı yapmamız gerekir. Farklı metotları tabiki bu kısma yazmadan önce interface içerisinde kodlamamız önemli.

LanguageController ile işlemleri bitirdiğimizde ApplicationUserController’ı oluşturacağız. Bu sınıf bizim, Identity yapısını kullanarak kullanıcı işlemleri yapmamızı sağlayacak. Kullanıcı ekleme,silme,güncelleme .. gibi ortak özelliklerin yanında bir sonraki derste göreceğimiz şifre değiştirme, mail adresi üzerinden kullanıcı bulma gibi ekstra metotları da içerecek. Öncelikle interfaceimizi oluşturacağız, bunun için web api projemize içinde bulunan Interfaces klasörüne solution explorer üzerinden sağ tıklıyoruz ve Add –> New Item diyerek, dosya tipi olarak Interface’i seçip Name alanına IUserController yazarak kaydediyoruz.

IUserController.cs dosyasına çift tıklayalım ve aşağıdaki şekilde içeriğini güncelleyelim.

Şimdi sıra UserController’ın kendisini oluşturmaya geldi bu sınıf az önce oluşturduğumuz IUserController arayüzünden kalıtım alacak. Solution explorer üzerinden wep api projemiz altında bulunan Controller klasörüne sağ tıklayalım ve Add –> Class diyerek Name alanına UserController yazıp kaydedelim. Daha sonra UserController.cs dosyasına çift tıklayarak içeriğiniz aşağıdaki şekilde düzenliyoruz.

Son olarak web api projemiz içinde bulunan startup.cs dosyasında çeşitli tanımlamalar yapacağız. Solution explorer üzerinde web api projemiz altında bulunan startup.cs dosyasını bulalım ve çift tıklayarak içini aşağıdaki şekilde güncelleyelim.

Projeyi Ateşliyoruz

Tüm işlemleri tamamladığımızda artık projeyi çalıştırıp test edebiliriz.

Klavyeden F5 tuşuna ya da debug menüsünden start debugging seçeneğine basalım. Uygulamamız çalıştığında tarayıcıda otomatik olarak açılacak ancak karşınıza tarayıcı ekranında 404 not found ibaresi gelecektir. İleriki derslerde projeye swagger kuracağız ve ilk açılışta swagger’ın gelmesini sağlayacağız. Şimdilik ilk testimizi yapmak için tarayıcıda adres satırında uygulamamızın adresinden sonra /Languages/GetAll yazalım ve entera basalım. (benim bilgisayarımda http://localhost:61025/language/getall bu link ile çalışıyor ancak sizde port farklı olabilir.) Eğer tüm işlemler doğru ise karşınıza aşağıdaki gibi bir ekran gelmeli.

Postman ile Testler

Şimdi bir de post örneği yapalım. Bunun için ben postman isimli uygulamayı kullanacağım ve anlatımı onun üzerinden yapacağım. Siz farklı bir uygulama ya da chrome üzerinden bir plug-in seçebilirsiniz, ekranlar aşağı yukarı aynı olacaktır. Postman’ı açtıktan sonra aşağıdaki ekran görüntüsünü takip edelim ve yeni bir dil eklemeyi deneyelim. Business katmanımızda yazdığımız dublicate kontrol sayesinde aynı culture değerine sahip iki farklı kayıt eklememiz engellenmiş olmalı. Deneyip sonucu görelim.

Yukarıdaki adımları tamamladığımız da ilk denememizde sonuç kısmında aşağıdaki şekilde bir görüntü görmeliyiz.

Body kısmında gönderdiğimiz Json içeriği değiştirmeden tekrar Send butonuna basarsak bu sefer aşağıdaki ekranın bizi karşılaması gerekiyor.

Aynı şekilde Yeni bir user eklemek için gereken bilgileri alt kısma yazıyorum. Postman ya da diğer rest tester uygulamaları üzerinden aşağıdaki adımları takip ederek kullanıcı eklemeyi deneyebilirsiniz. Bu işlemlerden sonra mutlaka veritabanınızı kontrol edin ve kayıtların oluşup oluşmadığınız gözlemleyin.

Kullanıcı eklemek için yapılması gerekenler;

1-) Url kısmına –>  http://localhost:61025//User/AddAsync  yazıyoruz ancak dikkat edin sizin uygulamanız farklı bir portta çalışıyor olabilir benim portum 61025.

2-) Body kısmına aşağıdaki JSON’ı yapıştırın ve içeriğini istediğiniz gibi düzenleyin. Language Id kısmına önceden eklediğiniz bir dilin Id sini yazın.

{
“emailConfirmed”: true,
“email”: “test@test.com”,
“userName”: “testuser”,
“password”: “Abc.123”,
“phoneNumber”: “112233445”,
“title”: “Manager”,
“phoneNumberConfirmed” : true,
“languageId” : “fe15e038-a5d4-450a-8c0c-b83d2f502f48”
}

Bir sonraki derste Identity alt yapısını kullanarak kullanıcı işlemlerini(sil,güncelle .. vs) tamamlayacak  ve rol işlemlerini göreceğiz.

Projenin buraya kadar olan kısmı ile ilgili sorun yaşıyorsanız bu link ile github üzerinden projeyi indirebilir ve kendi yazdığınız kodlar ile karşılaştırabilirsiniz. Sorularınız için yorum kısmını kullanabilir ya da mail adresim üzerinde benimle iletişime geçebilirsiniz.
Mail Adresim : mehmetalierol@windowslive.com

<- Önceki Post – Sonraki Post ->

.Net Core Eğitimleri

6-) Generic Repository ve UnitofWork

Başlarken

Önceki derslerde projemizde code first ile veritabanı tasarımı yapmıştık. Peki bu tablolar üzerinde CRUD(Create, Read, Update, Delete) işlemlerini nasıl yapacağız? Eğer klasik yöntemleri kullanacak olsaydık yüksek ihtimal ile her bir entity için ayrı ayrı yönetim sınıfları oluşturacak ve aynı kodları tekrar tekrar yazacaktık. Bu dersimizde Generic Repository ve UnitofWork desenlerini projemize dahil edeceğiz.

Generic Repository ve Unitofwork

Yazılım geliştirmede en önemli konulardan bir tanesi ortak noktaları görmek ve tekrarlı kod yazmaya yönelten tasarımlardan uzak durmaktır. Tüm entity lerimizde yapacağımız işlemler temelde aynı. Hepsinde ekleme, silme, seçme, güncelleme işlemleri yapacağız. Tabiki her entity’nin business ile ilgili ekstra kodları olacaktır ancak o kodlar o entitye özel olacağı için tekrarlı kod yazmak anlamına gelmeyecek sadece bir kez yazılacaklardır.  Repository pattern ile bu ortak işlemleri generic bir sınıf oluşturarak tek bir noktadan yürütebiliriz. Üzerinde CRUD işlemler yapmak istediğimiz entity sınıfımızı generic type olarak Repositorye gönderdiğimizde geri sadece yapmak istediğimiz işin komutunu vermek kalacak. Biz bu uygulamamızda Generic Repository ve UnitofWork alt yapısını kullanacağız. Repository bizim için yapılacak işleri bir kuyruğa ekleyecek ve zamanı geldiğinde unitofwork bu kuyrukta bulunan işlerin veritabanında gerçekleşmesini sağlayacak. Unitofwork genellikle sıralı işlere sahip uygulamaların alt yapısında kullanılmaktadır.

Günlük hayattan bir örnek vermeye çalışırsak bir oto kuaförümüz olduğunu varsayalım, işletmemizin cilalama, iç yıkama ve dış yıkama hizmetleri olsun. Her bir hizmeti yapmak için ayrı bölmelerimiz olduğunu varsayalım(İç yıkama alanı, dış yıkama alanı, cilalama alanı). Ödemeyi almadan da hizmet vermiyoruz. Müşteriler araçları getirdiğinde onları bizim Repository Ahmet karşılayacak  ve araca ne işlem yapılması gerektiğini öğrenerek ilgili hizmetin bölmesinde aracı sıraya sokacak(A aracına iç yıkama, B aracına cilalama .. vs). Burada dikkat etmemiz gereken husus araçlara henüz işlem yapılmadı ama işlem yapılmak üzere etiketlendi ve kuyruğa eklendi. Bu arada unitofwork Hasan ödemesi yapılan yani SaveChanges işlemini yapmış müşterilerin araçlarını gerekli işlemleri yapmak üzere ilgili bölümlere yönlendirecek ve artık fiziki olarak hizmet tamamlanmış olacak. Böylece bu işlemleri izole ettik ve birbirinden ayırdık. Herkes kendi işini yapıyor ve yönetilmesi daha kolay bir yapı ortaya çıkıyor. Zorlarsak kabaca bu şekilde bir yapı var diyebiliriz. :)

IGenericRepository Arayüzü

Şimdi Repository için önce bir Interface oluşturacağız ve repository içinde yapılmasını istediğimiz işlemlere ait metotların imzalarını tanımlayacağız. Interfacelerde metotların body’leri olmaz sadece ve sadece imzaları dediğimiz kısım yani ne parametre aldıkları ve ne cevap döndükleri bilgisi bulunur. Interface oluşturmak için aşağıdaki ekran görüntüsünü takip edebilirsiniz.

Generic Repository Interface'inin eklenmesi - Mehmet Ali EROL
Generic Repository Interface’inin eklenmesi

Common projemiz içerisinde bulunan Repository klasörüne sağ tıklayarak “Add –> Class” diyoruz.

Generic Repository Interface'inin eklenmesi 2 - Mehmet Ali EROL
Generic Repository Interface’inin eklenmesi

Açılan ekranda nesne tipi olarak interface seçiyoruz ve Name alanına IGenericRepository yazarak kaydediyoruz.

Eklediğimiz IGenericRepositoru interface’ine çift tıklayarak dosyayı açıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

GenericRepository Sınıfı

Artık projemizde kullanacağımız Repository nin hangi metotları içermesi gerektiğini biliyoruz. Sıra GenericRepository sınıfımızı oluşturmaya geldi.

Generic Repository sınıfının eklenmesi - Mehmet Ali EROL
Generic Repository sınıfının eklenmesi

Repository klasörüne sağ tıklayarak tekrar “Add –> Class” diyoruz.

Generic Repository sınıfının eklenmesi 2 - Mehmet Ali EROL
Generic Repository sınıfının eklenmesi 2

Daha sonra açılan ekrandan nesne tipini class olarak seçiyoruz ve Name alanına GenericRepository yazarak kaydediyoruz.

Oluşturduğumuz GenericRepository.cs dosyasına çift tıklıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

IUnitofWork Arayüzü

Repositoryden sonra sırada UnitofWork sınıfı var, bu sınıfı oluşturmak için yine bir interface ekleyerek metot imzalarımızı yazacak ve bir unitofwork sınıfında neler bulunması gerektiğini belirteceğiz. Bu kez Common projemiz altında bulunan UnitofWork klasörüne sağ tıklıyoruz ve “Add –> Class” dedikten sonra nesne tipi kısmından interface’i seçip Name alanına IUnitofWork yazarak kaydediyoruz.

Oluşturduğumuz IUnitofWork.cs dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz.

UnitofWork Sınıfı

Son olarak UnitofWork sınıfımızı oluşturacağız, bunun için UnitofWork klasörüne sağ tıklayarak “Add –> Class” diyoruz ve Name alanına UnitofWork yazarak kaydediyoruz.

Unitofwork.cs dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz.

Generic Repository ve Unitofwork dersi sonucunda SolutionExplorer görüntüsü - Mehmet Ali EROL
Generic Repository ve Unitofwork dersi sonucunda SolutionExplorer görüntüsü

Buraya kadar yaptığımız işlemleri doğru yaptı iseniz Solution Explorer üzerinde aşağıdaki gibi bir görüntü görüyor olmanız gerekiyor.

Kontrol etmek isterseniz projenin son haline github sayfam üzerinden bu link ile ulaşabilirsiniz. Sormak istediğini herhangi bir soru var ise yorumlar kısmından ya da mail adresim üzerinden bana ulaşabilirsiniz.
Mail Adresim : mehmetalierol@windowslive.com

<- Önceki Post – Sonraki Post ->

.Net Core Eğitimleri

1) .Net Core Nedir?

.Net Core

.Net Core, Microsoft ‘un açık kaynak kodlu olarak piyasaya sürdüğü bir “framework” tür.

Core öncesinde Microsoft tabanlı ortamlarda geliştirdiğiniz uygulamaları başka platformlar üzerinde koşturmak ya mümkün değildi ya da ekstra uygulamalar ve yöntemler gerektiriyordu. Microsoft, .Net Core ile birlikte bu sorunu ortadan kaldırmakla kalmadı aynı zamanda .Net Framework ile çalışırken karşılaşılan çeşitli sorunları da temizledi diyebiliriz. Örneğin dependency injection yapmak için Core öncesinde 3. parti çözümler kullanmak ve bir sürü ayar yapmak gerekebiliyordu ama artık Core içerisinde dependency injection gibi daha pek çok hayat kurtaran özellik gömülü bir şekilde geliyor. Olay sorunların giderilmesi ile sınırlı kalmıyor, bunların yanında performans üzerinde ciddi iyileştirmeler yapılmış ve tabi tüm bu iyileşmenin altında açık kaynak kod topluluğunun ciddi bir etkisi olduğunu söylemek gerekiyor. Bu link ile önceki sürümler ve .Net Core arasında performans karşılaştırmalarına göz atabilirsiniz.

Artık microsoft tabanlı bir işletim sistemi kullanmadan, visual studio geliştirme ortamına ihtiyaç duymadan gerekli geliştirmeleri yapabilir ve geliştirdiğiniz uygulamaları yine microsoft platformlarına bağımlı kalmaksızın başka ortamlarda çalıştırabiliriz. Core ‘un sürümlerine, sürümler içerisinde ne gibi farklılıkların bulunduğuna Microsoft’un sitesinden bakabilir ve gelişimi detaylıca görebilirsiniz.

Kısaca .Net Core’un temel özelliklerinden bahsettik, fazla detaya girerek gereksiz bilgiler vermek istemiyorum, daha detaylı bilgiye sahip olmak isteyenler mutlaka Microsoft’un sitesinden araştırma yapmalı ve gelinen son noktayı tecrübe etmeli.

Yazı Serisinin Amacı

Bu eğitim adım adım kurumsal bir backend projesinin nasıl yapılacağı ile ilgili bilgi vermek amacı ile hazırlanmıştır. Projeyi en baştan ekran görüntüleri ile birlikte oluşturacağız ve aşağıdaki özellikleri içerecek şekilde tamamlayarak hep birlikte yayına alacağız. Daha sonrasında angular 6 ile frontend tarafında geliştirmeler yapacağız. Ancak o başka bir ders konusu altında olacak. Aşağıda bulunan adımları içeren örnek projeyi bugün itibari ile bitirdim fakat yazıları yazmak ve yayınlamak biraz vaktimi alacak, bu nedenle eğer aşağıda bulunan konulardan herhangi birine ihtiyacınız var ise benimle iletişime geçebilirsiniz, örnek kodları sizinle paylaşabilirim.

Projenin Tanıtımı

Proje Adımları;
1- )    Projemizin oluşturulması ve gereklilikler
2- )    Projenin ana bilgilerini saklayacak common katmanının oluşturulması
3- )    .Net Core Identity ‘nin aktif hale getirilmesi ve code first ile veritabanı tasarımı
4- )    Data Transfer Object (Dto) ‘ların oluşturulması ve Auto Mapper
5- )    Repository ve UnitofWork tasarım desenlerinin eklenmesi
6- )    Web Api projesinin oluşturulması
7- )    ILogger ile dosya sistemine loglama ve AutoHistory ile değişiklik geçmişi
8- )    Usermanager ve Rolemanager ile Identity üzerinde kullanıcı işlemleri
9- )    Jwt token alt yapısı ile kullanıcı authentication alt yapısının kurulması
10- ) Rol bazlı authorization işlemleri
11- ) Web cache kullanımı ve projeye implemente edilmesi
12- ) Web api üzerinde paging alt yapısının kurulması
13- )  SignalR ile canlı veri akışının sağlanması
14- )  Unit testlerin yazılması ve Moq kullanımı
15- ) Swagger

<- Önceki Post – Sonraki Post ->