Dotnet Core 3.1 ile Restful Api Altyapısı Oluşturma Part-II

Mustafa Alkan
BilgeAdam Teknoloji
4 min readAug 19, 2020

Dotnet Core 3.1 ile Restful Api Altyapısı Oluşturma Part-I

Dependency Injection Kavramı

Dependency Injection, S.O.L.I.D prensiplerinin 5.si ve sonuncusu “Dependency Inversion” prensibinin uygulanmasını içeren bir patterndir. Peki bu prensip neyi amaçlar?

Üst seviyeli classlar alt seviyeli classlara bağlı olmamalı, her iki sınıf ta abstract classlara bağlı olmalıdır

Dependency Injection patternin amacı nesnelerin bir tipe bağlı olmaktansa, inherit edildiği soyut classlara bağlı olmasını sağlamak, böylece Loose Coupling ( Gevşek Bağlılık) sağlamaktır.

Dotnet Core hali hazırda Dependecy Injection (DI) patternini desteklemektir. Dependency Injection IOC’un uygulama methodur.

IOC (Inversion of Control) ise uygulama içerisindeki nesnelerin instancelarını yani uygulama boyunca yaşam döngüsünü yönetmek ve bağımlılıkları en aza indirmek kullandığımız bir tasarım prensibidir.

IOC Containerlar: Ioc implementasyonu yapmak için farklı containerlar vardır. En çok kullanılan Autofac, Unity ve Ninject gibi thirt party kütüphanelerdir. Dotnet Core’da ise bu kütüphaneleri kurmamıza gerek kalmadan her sınıfın uygulamadaki yaşam döngüsünü yönetebileceğimiz 3 farklı method vardır:

Dotnet Core LifeTimes:

AddSingleton: uygulama ilk ayağa kalktığı anda, servisin tek bir instance’ı oluşturularak memory’de tutulur ve daha sonrasında her servis çağrısında bu instance gönderilir.

AddScoped: her request için tek bir instance yaratılmasını sağlayan lifetime seçeneğidir. request cycle’ı tamamlanana kadar gerçekleşen servis çağrılarında daha önce oluşturulan instance gönderilir. daha sonra yeni bir request başladığında farklı bir instance oluşturulur.

AddTransient: her servis çağrısında yeni bir instance oluşturulur. bağlayıcılığı en az olan lifetime seçeneğidir.

Şimdi de dotnet Core uygulamamızda DI’yı nasıl implemente ettik ona göz atalım:

Startup.cs classımız içerisinde ConfigureService methodumuz içerisine aşağıdaki classları ve bağımlılıklarını ekliyoruz:

Daha sonra interfaceleri ilgili classlarımızın constructurlarına inject ediyoruz: Aşağıdaki kod örneklerinde dikkat ederseniz, ProductManager.cs servisimize IUnitOfWork interface’ini, ProductApiController controllerımıza ise IProductService interface’ini inject ettikten sonra DI bizim için instanceları yönetiyor.

En basit şekilde DI’yı anlatmaya çalıştım. Fakat daha detaylı araştırmak isterseniz DI ve IOC ile ilgili benim de faydalandığım bir çok güzel makaleler var. En aşağıda kaynakları paylaşıyor olacağım.

Product Service

Sırada ise IProductService ve ProductManager classlarımız var. Business adında director oluşturup içine Abstract ve Service directoryleri oluşturuyoruz. Abstract içine Service classlarımızın inherit alacağı interfaceleri, Service klasörü içine ise Domain Logic operasyonlarının yönetileceği classımızı ekliyoruz.

Şimdi gelelim Dependency Injection’ı sağlamak için Startup.cs içine ConfigureServices methodu içinde yukarıdaki interface ile sınıfı birbirne bağlayalım.

services.AddTransient<IProductService, ProductManager>();

Yukarıda dikkat ederseniz AutoMapper kütüphanesi kullandım. AutoMapper adı üzerinde iki nesneyi birbirine map etmek için kullanılan, karmaşık koddan kurtulmak için oluşturulan basit bir kütüphanedir. Çok fazla propertysi olan nesneleri maplemek istediğimizde hayat kurtarır :)

Nuget Package Manager üzerinden indirebilirsiniz veya install-package AutoMapper komutunu Package Manager Console’ dan çalıştırıp ilgili kütüphaneyi yükleyebilirsiniz.

Automapper’ı kullanabilmemiz için Startup.cs içinde configure edip Service olarak eklememiz gerekiyor. Bunun için Startup classımız içinde ConfigureService methoduna aşağıdaki kodu eklememiz gerekiyor:

Product Controller

En son aşama olarak ta Controllerımızı oluşturmak kaldı. Zaten her şeyi servis bizim için yapacak. Biz sadece servise parametrelerle istek atıp gelen cevabı handle edeceğiz. ProductController’ımız şu şekilde:

SWAGGER

Swagger benim Api endpoint geliştirirken kullandığım güzel bir arayüz sunan, geliştirdiğim api endpointleri monitoring etmemi, yönetebilmemi ve test edebilmemi sağlayan, tüm api endpointleri ve bu apilerin http methodlarını ve bodylerini gösteren, ayrıca Authantication için de bize kolaylık sağlayan özellikle JWT entegrasyonu olan kullanımı kolay bir kütüphane.

Gelelim Swagger kurulumuna. Madde madde sizlerle paylaşacağım.

  1. Önce kurmamız gereken bazı packageler var. Onlarla başlayalım:

Install-Package Swashbuckle.AspNetCore

Install-Package Swashbuckle.AspNetCore.SwaggerGen

Install-Package Swashbuckle.AspNetCore.SwaggerUI

2. Startup.cs classımız içerisinde ConfigureService methodu içerisine aşağıdaki kodları ekleyelim:

Configure Methodunun içersine ise Swagger Middlewarelerini ekleyelim:

3. Son olarak web projemize sağ tıklayıp Properties sayfasını açıyoruz. Oradan Debug sekmesini tıklayıp karşımıza gelen ekrandaki Launch Browser alanını swagger/index.html ile değiştiriyoruz.

İşte bu kadar :)

Şimdi ise projemizi derleyip çalıştıralım ve sonucu görelim:

Yukarda anlattığım projenin github repositorysine buradan ulaşabilirsiniz: Github Link.

Aynı altyapı ve çok katmanlı mimari ve bunun haricinde Authantication için JWT token kullanılarak hazırlanmış olduğum Todo Dotnet Core 3.1 projesi için de bu linke tıklayabilirsiniz:

Todo App Link

--

--

Mustafa Alkan
BilgeAdam Teknoloji

Senior Software Engineer #DotnetCore #Aspnet #Mvc #Net5