Anlatıma geçmeden önce AspNet Core 8.0 ile geliştirdiğimiz bu projeye ait linkleri aşağıda sıraladım.
AspNet Core 8.0 projesi için linkler
Ayrıca bir önceki yazıyı okumadıysanız;
AspNet Core ile geliştirdiğimiz projenin bu bölümünde anasayfaya devam ediyoruz.
“Biz Kimiz” kısmını düzenleyelim
İlk olarak WhoWeAre componentindeki öğeleri tutabilmek için data tarafında bir tablo oluşturmamız gerekiyor. Componentin yapısı gereği hocamız iki farklı tabloda tutmak istemiş. Bu sebeple data tarafına gelip yeni bir query yazmak ile başlıyoruz. MacOS tarafında kodlama yaptığım için ben Azure Data Studio üzerinden gideceğim. Ancak SQL query’si platforma göre değişkenlik göstermediği için vereceğim kodları siz de çalıştırabilirsiniz.
CREATE TABLE WhoWeAreDetail
(
WhoWeAreDetailID int IDENTITY(1,1) PRIMARY KEY,
Title NVARCHAR(100),
Subtitle NVARCHAR(100),
Description1 NVARCHAR(500),
Description2 NVARCHAR(500),
)
Tablomuzun adı WhoWeAreDetail olacak. Bu sebeple Create Table derken ismini bu şekilde belirttik. Ardından tablomuzun alanlarını tanımladık. ID tanımladık identity özelliği ile 1’er 1’er artacak ve primary key olarak tanımladık. Componentte başlık ve alt başlık olması sebebi ile Title ve Subtitle alanlarını oluşturduk. İki adet uzun metin olması sebebi ile de Description1 ve Description2 alanlarını tanımladık. Bu işlem sonrasında run tuşuna basarak query’i çalıştırıp tablonun oluşmasını sağladık.
Yukarıdaki buton yardımı ile zip dosyasından çıkartıp Azure Data Studio’da veya MSSQL’de çalıştırabilirsiniz.
İkinci olarak Service tablosu oluşturacağız. Bu da web sitemizde verdiğimiz hizmetleri tutuyor olacak.
CREATE TABLE Service
(
ServiceID int IDENTITY(1,1) PRIMARY KEY,
ServiceName NVARCHAR(100),
ServiceStatus Bit
)
Service tablomuzu oluşturmak için querymizde bu. Id, servis adı ve durumu bilgilerini bu sayede tutuyor olacağız.
Şimdi ise data ile proje bağlantılarını yapabilmek için IDE’mize dönüyoruz(VS Code veya Visual Studio)
API projemizde Repositories klasörünün içerisinde bir klasör oluşturacağız. Bu klasörün adı WhoWeAreDetailRepository olacak.
Bu klasörün içerisinde iki adet dosya oluşturacağız. Bir tanesi interface diğeri ise class olacak.
- IWhoWeAreDetailRepository (Interface)
- WhoWeAreDetailRepository (Class)
Interface’imizde metodlarımızı tanımlayacağız ancak dönen verileri bir DTO’ya aktarmamız gerekiyor. DTO’muzu tanımlamadığımız için hemen API > Dtos klasöründe bir klasör oluşturuyoruz. Adı WhoWeAreDetailDtos olacak. Bu klasörün içinde ise bir class tanımlayacağız. Bu class’ın adı da ResultWhoWeAreDetailDto olacak.
Dto’muzda geri dönüş değerleri olarak tablomuzdaki tüm kolonları döneceğimiz için hepsini tanımlıyoruz.
namespace RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos
{
public class ResultWhoWeAreDetailDto
{
public int WhoWeAreDetailID { get; set; }
public string Title { get; set; }
public string Subtitle { get; set; }
public string Description1 { get; set; }
public string Description2 { get; set; }
}
}
Yukarıdaki kod ResultWhoWeAreDetailDto.cs dosyasına aittir.
Diğer metodumuz olan Create için de Dto sınıfımızı tanımlayalım. Bunun için WhoWeAreDetailDtos klasörü içerisinde CreateWhoWeAreDetailDto.cs adında bir class oluşturuyoruz.
namespace RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos
{
public class CreateWhoWeAreDetailDto
{
public string Title { get; set; }
public string Subtitle { get; set; }
public string Description1 { get; set; }
public string Description2 { get; set; }
}
}
Burada ID’ye ihtiyacımız yok. Çünkü database bunu bizim için otomatik olarak yapacak. Biz sadece datada oluşturmak istediğimiz verileri vermemiz yeterli.
Aynı işlemi update içinde yapalım.
namespace RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos
{
public class UpdateWhoWeAreDetailDto
{
public int WhoWeAreDetailID { get; set; }
public string Title { get; set; }
public string Subtitle { get; set; }
public string Description1 { get; set; }
public string Description2 { get; set; }
}
}
Son olarak GetByIDWhoWeAreDetailDto class’ımızı da oluşturalım.
namespace RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos
{
public class GetByIDWhoWeAreDetailDto
{
public int WhoWeAreDetailID { get; set; }
public string Title { get; set; }
public string Subtitle { get; set; }
public string Description1 { get; set; }
public string Description2 { get; set; }
}
}
Şimdi interface’imize dönerek metodlarımızı tanımlayalım.
using RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos;
namespace RealEstate_Dapper_Api.Repositories.WhoWeAreDetailRepository
{
public interface IWhoWeAreDetailRepository
{
Task<List<ResultWhoWeAreDetailDto>> GetAllWhoWeAreDetailAsync();
void CreateWhoWeAreDetail(CreateWhoWeAreDetailDto whoWeAreDetailDto);
void DeleteWhoWeAreDetail(int id);
void UpdateWhoWeAreDetail(UpdateWhoWeAreDetailDto categoryDto);
Task<GetByIDWhoWeAreDetailDto> GetWhoWeAreDetail(int id);
}
}
Yukarıdaki kodda şu metodları tanımladık;
- GetAllWhoWeAreDetailAsync
- CreateWhoWeAreDetail
- DeleteWhoWeAreDetail
- UpdateWhoWeAreDetail
- GetWhoWeAreDetail
Şimdi bu interface’i repository class’ımızda implemente ederek metodların içlerini dolduracağız. Bunun için WhoWeAreDetailRepository.cs dosyamızı açıyoruz. ( Api > Repositories > WhoWeAreDetailRepository klasöründe )
ASPNET Interface’in implementasyonu ve metodların doldurulması
Sınıfımızın içerisinde, yukarıdaki görseldeki gibi 3. satırda “: IWhoWeAreDetailRepository” üzerine gelip cmd + . tuş yardımı ile “Ara birimi uygula” butonuna basıyoruz. IDE’miz bizim için metodları otomatik olarak oluşturuyor. Bizim sadece içlerini doldurmamız kalıyor.
using RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos;
namespace RealEstate_Dapper_Api.Repositories.WhoWeAreDetailRepository
{
public class WhoWeAreDetailRepository : IWhoWeAreDetailRepository
{
public void CreateWhoWeAreDetail(CreateWhoWeAreDetailDto whoWeAreDetailDto)
{
throw new NotImplementedException();
}
public void DeleteWhoWeAreDetail(int id)
{
throw new NotImplementedException();
}
public Task<List<ResultWhoWeAreDetailDto>> GetAllWhoWeAreDetailAsync()
{
throw new NotImplementedException();
}
public Task<GetByIDWhoWeAreDetailDto> GetWhoWeAreDetail(int id)
{
throw new NotImplementedException();
}
public void UpdateWhoWeAreDetail(UpdateWhoWeAreDetailDto whoWeAreDetailDto)
{
throw new NotImplementedException();
}
}
}
Ara birimi uygulayınca kodlarımız bu şekilde gözükecek.
Repository data ile iletişime geçecek sınıf olduğundan ilk olarak bir context oluşturmamız gerekiyor. Bunun için aşağıdaki kodları WhoWeAreDetailRepository class’ımız içerisinde tanımlamalıyız;
private readonly Context _context;
public WhoWeAreDetailRepository(Context context)
{
_context = context;
}
context yardımı ile tüm metodlarımız içerisinde dataya erişim sağlayabileceğiz.
Metodalara geçerken dikkat etmeniz gereken bir şey var. Metodlar async olmalı! Aksi durumda hata alırsınız.
CreateWhoWeAreDetail metodunu şu şekilde düzenliyoruz;
public async void CreateWhoWeAreDetail(CreateWhoWeAreDetailDto whoWeAreDetailDto)
{
string query = "INSERT INTO WhoWeAreDetail (Title,Subtitle,Description1,Description2) values (@title,@subtitle,@description1,@description2)";
var parameters = new DynamicParameters();
parameters.Add("@title", whoWeAreDetailDto.Title);
parameters.Add("@subtitle", whoWeAreDetailDto.Subtitle);
parameters.Add("@description1", whoWeAreDetailDto.Description1);
parameters.Add("@description2", whoWeAreDetailDto.Description2);
parameters.Add("@whoWeAreDetailStatus", true);
using (var connection = _context.CreateConnection())
{
await connection.ExecuteAsync(query, parameters);
}
}
Sırada DeleteWhoWeAreDetail metodumuz var.
public async void DeleteWhoWeAreDetail(int id)
{
string query = "DELETE FROM WhoWeAreDetail WHERE WhoWeAreDetailID=@whoWeAreDetailID";
var parameters = new DynamicParameters();
parameters.Add("@whoWeAreDetailID", id);
using (var connection = _context.CreateConnection())
{
await connection.ExecuteAsync(query, parameters);
}
}
Şimdi ise GetAllWhoWeAreDetailAsync metodumuz var;
public async Task<List<ResultWhoWeAreDetailDto>> GetAllWhoWeAreDetailAsync()
{
string query = "Select * From WhoWeAreDetail";
using (var connection = _context.CreateConnection())
{
var values = await connection.QueryAsync<ResultWhoWeAreDetailDto>(query);
return values.ToList();
}
}
ID’ye göre sorgu yapabileceğimiz GetWhoWeAreDetail(int id) metodumuz;
public async Task<GetByIDWhoWeAreDetailDto> GetWhoWeAreDetail(int id)
{
string query = "SELECT * FROM WhoWeAreDetail WHERE WhoWeAreDetailID=@whoWeAreDetailID";
var parameters = new DynamicParameters();
parameters.Add("@whoWeAreDetailID", id);
using (var connection = _context.CreateConnection())
{
var result = await connection.QueryFirstOrDefaultAsync<GetByIDWhoWeAreDetailDto>(query, parameters);
return result;
}
}
En sonuncu olan UpdateWhoWeAreDetail metodunu da güncelleyelim;
public async void UpdateWhoWeAreDetail(UpdateWhoWeAreDetailDto whoWeAreDetailDto)
{
string query = @"UPDATE WhoWeAreDetail SET
Title=@title,
Subtitle=@subtitle,
Description1=@description1,
Description2=@description2
where WhoWeAreDetailID=@whoWeAreDetailID";
var parameters = new DynamicParameters();
parameters.Add("@title", whoWeAreDetailDto.Title);
parameters.Add("@subtitle", whoWeAreDetailDto.Subtitle);
parameters.Add("@description1", whoWeAreDetailDto.Subtitle);
parameters.Add("@description2", whoWeAreDetailDto.Subtitle);
parameters.Add("@whoWeAreDetailID", whoWeAreDetailDto.WhoWeAreDetailID);
using (var connection = _context.CreateConnection())
{
await connection.ExecuteAsync(query, parameters);
}
}
Evet tüm metodlarımızı yazmış olduk. Artık API Controller’ımızı yazmak ve UI projesinde gerekli tanımlamaları yapmak kaldı.
ASPNET API Controller Yazalım
API projemizde Controllers klasörü içerisinde WhoWeAreDetailController adında API Controller oluşturuyoruz. API Controller olmasına dikkat edin. Ardından CategoriesController’ındaki metodlarla birebir aynı metodları kullanacağımız için oradakileri WhoWeAreDetailController’a kopyaladık. Ardından ilgili kısımlardaki isim değişikliklerini yaptık. Sonuç olarak WhoWeAreDetailController’ımız şu şekilde olmalı;
using Microsoft.AspNetCore.Mvc;
using RealEstate_Dapper_Api.Dtos.WhoWeAreDetailDtos;
using RealEstate_Dapper_Api.Repositories.WhoWeAreDetailRepository;
namespace RealEstate_Dapper_Api.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WhoWeAreDetailController : ControllerBase
{
private readonly IWhoWeAreDetailRepository _whoWeAreRepository;
public WhoWeAreDetailController(IWhoWeAreDetailRepository whoWeAreDetailRepository)
{
_whoWeAreRepository = whoWeAreDetailRepository;
}
[HttpGet]
public async Task<IActionResult> WhoWeAreDetailList()
{
var values = await _whoWeAreRepository.GetAllWhoWeAreDetailAsync();
return Ok(values);
}
[HttpPost]
public async Task<IActionResult> CreateWhoWeAreDetail(CreateWhoWeAreDetailDto createWhoWeAreDetailDto)
{
_whoWeAreRepository.CreateWhoWeAreDetail(createWhoWeAreDetailDto);
return Ok("Biz kimiz kısmı başarılı bir şekilde eklendi");
}
[HttpDelete]
public async Task<IActionResult> DeleteWhoWeAreDetail(int id)
{
_whoWeAreRepository.DeleteWhoWeAreDetail(id);
return Ok("Biz kimiz kısmı başarılı bir şekilde silindi");
}
[HttpPut]
public async Task<IActionResult> UpdateWhoWeAreDetail(UpdateWhoWeAreDetailDto updateWhoWeAreDetailDto)
{
_whoWeAreRepository.UpdateWhoWeAreDetail(updateWhoWeAreDetailDto);
return Ok("Biz kimiz kısmı başarılı bir şekilde güncellendi");
}
[HttpGet("{id}")]
public async Task<IActionResult> GetWhoWeAreDetail(int id)
{
var value = await _whoWeAreRepository.GetWhoWeAreDetail(id);
return Ok(value);
}
}
}
Dosya olarak indirebilmeniz için yukarıya bıraktım. API controller’ını, repository’sini ve interface’ini hazırladık. Ancak unuttuğumuz bir şey var. O da program cs tarafındaki eklememiz gereken şu kod;
builder.Services.AddTransient<IWhoWeAreDetailRepository, WhoWeAreDetailRepository>();
Bu işlem sonrası projeyi çalıştırıyoruz ve api’lerimizi test ediyoruz. Test edebilmek için POST yazan kısmı açıp Try it out butonuna basalım ve Response body kısmındaki kodu aşağıdaki kod ile değişelim.
{
"title": "Biz Kimiz?",
"subtitle": "Deneme Yapıyoruz",
"description1": "Açıklama 1",
"description2": "Açıklama 2"
}
Ardından Execute butonuna basıp response’a bakalım.
Biraz aşağı kaydırdığımızda 200 success kısmını görmeliyiz.
Ardından get işlemi için aynı işlemleri yapacağız. Ancak bu sefer kod eklemeyeceğiz. Çünkü sadece verileri getirmek istiyoruz.
Yukarıdaki gibi Execute butonuna basmamız yeterli olacaktır.
Ardından sizi yukarıdaki gibi bir ekran karşılayacak ve 200 kodunun yanında JSON formatında veriler dönecek.
Update metodu için buradaki verileri kopyalayalım. Ancak [ ] köşeli parantezler olmayacak.
{
"whoWeAreDetailID": 1,
"title": "Biz Kimiz?",
"subtitle": "Deneme Yapıyoruz",
"description1": "Açıklama 1",
"description2": "Açıklama 2"
}
Yani bu kodu kopyalayacaksınız. PUT kısmını açıp Try it out butonuna basın ve kırmızı ile gösterdiğim alana kodunuzu yapıştırın.
Ardından değiştirmek istediğiniz veriyi değiştirin. Hoca derste description1’i a, description2’yi b olarak güncelliyor.
{
"whoWeAreDetailID": 1,
"title": "Biz Kimiz?",
"subtitle": "Deneme Yapıyoruz",
"description1": "a",
"description2": "b"
}
Yukarıdaki görünümü elde ettikten sonra Execute butonuna basıyoruz. Ekranı biraz aşağı kaydırın ve success mesajını görün.
Bu işlem sonrası tekrar get metodunu çalıştırın ve verilerin güncellediğiniz gibi geldiğinden emin olun.
Evet bu derslik bu kadardı. Bir sonraki derste görüşmek üzere.