Bu proje bir Araba Kiralama Sistemi hakkında. Her hafta yeni güncellemeler ekleyerek hem kurumsal mimariye uygun hem SOLID prensiplerine uygun hemde kendimizi tekrar etmeyeğimiz şekilde yazılmaya çalışılmaktadır. Olabildiğince kampa göre hareket edip buna uygun bir dökümantasyon yapmaktayım. Özellikle benim gibi bu projeyle uğraşan arkadaşlara bu projeyi ilerletirken bu kısımları şu şekilde oluşturdum diyebilmek, sizlerde fikir oluşturmak, anlamadığınız ya da eksik kaldığınız yerlerde destek olmaya çalışmak ve kendimi geliştirmek...
Burada her yapılan değişiklik Bölüm 1 - 8. Gün, Bölüm 2 - 9. Gün vb. tarzında olacaktır ve yapılan değişiklikler başta yer alacaktır.
-
Brand ve Color nesneleri ekleyiniz(Entity)
Brand-->Id,Name
Color-->Id,Name
-
Sql Server tarafında yeni bir veritabanı kurunuz. Cars,Brands,Colors tablolarını oluşturunuz. (Araştırma)
-
Sisteme Generic IEntityRepository altyapısı yazınız.
-
Car, Brand ve Color nesneleri için Entity Framework altyapısını yazınız.
-
GetCarsByBrandId , GetCarsByColorId servislerini yazınız.
-
Sisteme yeni araba eklendiğinde aşağıdaki kuralları çalıştırınız.
Araba ismi minimum 2 karakter olmalıdır
Araba günlük fiyatı 0'dan büyük olmalıdır.
ReCap.Business, ReCap.ConsoleApp(Şuanlık UI yerine kullanılıyor), ReCap.DataAccess, ReCap.Entities
Interface'lerin yer aldığı kısım
Abstract(Soyut) klasörü içerisinde yer alan Interfaceleri Concrete'te implemente ettiğimiz kısım. Örneğin; Interface'lerdeki metotların imzalarına göre dahil ettiğimiz bu metotları doldurduğumuz kısımlar.
Bir sınıfın yeni bir instance(örnek)'ını oluşturup (
CarManager carManager = new CarManager();
) verileri eklediğimiz, sildiğimiz, güncellediğimiz (
Car car = new Car()
{
Id=1,
BrandId=2,
ColorId=3,
Description = "Kırmızı Otomatik Araba"
};
) ve bir sürü yeni kodlar yazacağımız kısım.
Database Adı: ReCapDB
ReCapDB'de yer alan tablolarımız: Cars, Brands, Color
Tabloların içine veriler eklemek için(Aynı Query sayfasına yazılabilir ya da ReCapDB -> Mouse Sağ Click -> New Query diyip yeni sayfada yazılabilir);
CREATE TABLE Colors(
Id int PRIMARY KEY IDENTITY(1,1),
ColorName nvarchar(50),
)
CREATE TABLE Brands(
Id int PRIMARY KEY IDENTITY(1,1),
BrandName nvarchar(50),
)
CREATE TABLE Cars(
Id int PRIMARY KEY IDENTITY(1,1),
BrandId int,
ColorId int,
ModelYear nvarchar(25),
DailyPrice decimal,
Descriptions nvarchar(200),
FOREIGN KEY (ColorId) REFERENCES Colors(Id),
FOREIGN KEY (BrandId) REFERENCES Brands(Id)
)
INSERT INTO Cars(BrandId,ColorId,ModelYear,DailyPrice,Descriptions) VALUES
(1,1,'2018',180,'Honda/Civic - Beyaz - Otomatik Hybrid'),
(2,3,'2015',170,'Mercedes - Kırmızı - Otomatik Dizel'),
(3,2,'2017',300,'BMW - Siyah - Otomatik Hybrid'),
(4,4,'2013',115,'Renault/Kangoo - Mavi - Manuel Benzin');
INSERT INTO Colors(ColorName) VALUES('Beyaz'),('Siyah'),('Kırmızı'),('Mavi');
INSERT INTO Brands(BrandName) VALUES ('Honda'),('Mercedes'),('BMW'),('Renault');
-
CarRental Projenizde Core katmanı oluşturunuz.
-
IEntity, IDto, IEntityRepository, EfEntityRepositoryBase dosyalarınızı 9. gün dersindeki gibi oluşturup ekleyiniz.
-
Car, Brand, Color sınıflarınız için tüm CRUD operasyonlarını hazır hale getiriniz.
-
Console'da Tüm CRUD operasyonlarınızı Car, Brand, Model nesneleriniz için test ediniz. GetAll, GetById, Insert, Update, Delete.
-
Arabaları şu bilgiler olacak şekilde listeleyiniz. CarName, BrandName, ColorName, DailyPrice. (İpucu : IDto oluşturup 3 tabloya join yazınız)
Bu bölümde Code Refactoring yaptık. CRUD işlemleri her veritabanında ortak olduğu için bunu Core katmanına aldık. Böylece Core katmanımızda tüm projelerde yer alması gereken temel şeyler yer alacak.
Çoğu kısmı dersi izleyipte çoğu kişi yapmıştır lakin DTO(Data Transfer Object) kısmında veritabanına bizim belirlediğimiz tablolardan belirlediğimiz alanları tek bir yerden getirme ile ilgili olan kısım biraz kafa karıştırıcı. Bu yüzden de burada bunu açıklamaya çalışacağım.
5. şartta bize CarName, BrandName, ColorName, DailyPrice getirmemizi istiyor fakat BrandName Brand tablosunda, ColorName Color tablosunda ve biz bunu Car tablosundan çağırmak istediğimizde sadece ColorId ve BrandId'ye erişebiliyoruz.
Yani DTO kısmı aslında benim yukarıda dediğim "bizim belirlediğimiz tablolardan(birbirlerine ait ID'ler yer alan) belirlediğimiz alanları tek bir yerden getirme kısmını yapmamıza izin verir" kısmı yapmaya olanak verir.
Aşağıdaki resimde hangi alanları istiyorsam yazdım.
Not: Bu bir Car sınıfına özgü birşey ve içerisinde BrandId, ColorId yer aldığı için benim geri kalan tüm işlemlerimi Car'a ait yerlerde EFCarDal, ICarService ve CarManager'da yapmam lazım.
Resimde görüldüğü üzere EFCarDal içerisinde Car, Color, Brand tablolarını birleştirip hangi alanları istiyorsam o alanları yer aldığı tablodan çektim.
Ve Program.cs'de foreach ile çağırıp çalıştırdığımda resimdeki gibi bilgileri elde etmekteyim.
Evet arkadaşlar Color, Brand, Car için tüm CRUD işlemleri Program.cs'de yapıldı ve hepsini kendiye alakalı #region'ların içine koydum. "+" olan yere tıkladığınızda BrandCRUDOperation, ColorCRUDOperation, CarCRUDOperation ve DTOUsing'in içeriğini görebilirsiniz.
Car Rental Projenizde;
-
Core katmanında Results yapılandırması yapınız.
-
Daha önce geliştirdiğiniz tüm Business sınıflarını bu yapıya göre refactor (kodu iyileştirme) ediniz.
CarRental projenizde;
-
Kullanıcılar tablosu oluşturunuz. Users-->Id,FirstName,LastName,Email,Password
-
Müşteriler tablosu oluşturunuz. Customers-->UserId,CompanyName ***Kullanıcılar ve müşteriler ilişkilidir.
-
Arabanın kiralanma bilgisini tutan tablo oluşturunuz. Rentals-->Id, CarId, CustomerId, RentDate(Kiralama Tarihi), ReturnDate(Teslim Tarihi). Araba teslim edilmemişse ReturnDate null'dır.
-
Projenizde bu entity'leri oluşturunuz.
-
CRUD operasyonlarını yazınız.
-
Yeni müşteriler ekleyiniz.
-
Arabayı kiralama imkanını kodlayınız. Rental-->Add
-
Arabanın kiralanabilmesi için arabanın teslim edilmesi gerekmektedir.
SQL Server Object Explorer ReCapDB'mde User, Customer, Rental tablolarını eklemek için;
CREATE TABLE Users(
Id int PRIMARY KEY IDENTITY(1,1),
FirstName nvarchar(30),
LastName nvarchar(30),
Email nvarchar(150),
Password nvarchar(20),
)
CREATE TABLE Customers(
Id int PRIMARY KEY IDENTITY(1,1),
UserId int,
CompanyName nvarchar(200)
)
CREATE TABLE Rentals(
Id int PRIMARY KEY IDENTITY(1,1),
CarId int,
CustomerId int,
RentDate nvarchar(25),
ReturnDate nvarchar(25),
FOREIGN KEY (CarId) REFERENCES Cars(Id),
FOREIGN KEY (CustomerId) REFERENCES Customers(Id)
)
Çünkü bu tabloların Entities (User, Customer, Rental), DataAccess (IUserDal, ICustomerDal, IRentalDal, EFUserDal, EFCustomerDal, EFRentalDal), Business (IUserService, ICustomerService, IRentalService, UserManager, CustomerManager, RentalManager) katmanları çalışır vaziyette olur. Ama Program.cs'de Managerların->Add metotlarını çağırmak isteyinde o tablolar SET edilmediği için tabloları bulamaz ve hata verir! (Tecrübeyle kanıtlanmıştır 😁)
Resimde görüldüğü üzere biz Data Field'ını GET özelliği verdik sadece yani ReadOnly'dir ama biz Constructor'da Data'ya dışarıdan bir veriyi SET ettik. Nasıl böyle birşey olabilir?
Bunun cevabı: Getter'lar(resimde get olarak tanımladığımız yer) ReadOnly'dir ve sadece Constructor'da Set edebilirsin!!! Yani Constructor dışında Set etme yapamazsın eğer bir Field'a set özelliği vermediysen!
CarRental projenizde;
- WebAPI katmanını kurunuz.
- Business katmanındaki tüm servislerin Api karşılığını yazınız.
Evet arkadaşlar, ben burada API'lerimi test ederken Swagger kullanmayı tercih ettim. Postman'a nazaran kullanımı daha kolay. Çünkü Postman'da her metot için tek tek Controller'a bakıp düzenlemem gerekiyorken Swagger'da WebAPI katmanı altında yer alan tüm Controller'larımı ve onlara ait tüm API'leri hem görmemi hemde tek yerde hepsini denememe imkan veriyor.
- WebAPI projemize gelip mouse sağ click ile Manage Nuget Packages... açın.
- Browse kısmına NSwag.AspNetCore yazın ve indirin. (Resimdeki gibi)
- İndirdikten sonra WebAPI'nin altında Startup.cs'yi açın. Resimdeki gibi sırayla ConfigureServices kısmına services.addSwaggerDocument(); yazın. Sonra da altında yer alan Configure metodunun için sırayla app.UseOpenAPI(); app.UserSwaggerUi3(); yazın. (Burayla işiniz bitti.)
- Şimdi Projeyi WebAPI'den başlatın. (WebAPI'ye Set as Startup Project demeyi unutmayın. Çünkü projemizi artık buradan kontrol edicez)
- Proje Chrome'da açılınca resimdeki gibi localhost:port numarasının sonuna /swagger/index.html eklemeyi unutmayın.
- Swagger açılınca karşınızda bizim Controller'larımız ve onlara ait API'leri yer almaktadır.
- Brands'in altında yer alan getall'a tıklayın içerisinde Try it out tıklayın.
- Execute tuşuna basın.
- Ve görüldüğü üzere sonuç karşımızda.