ReCapProject: Araba Kiralama Sistemi
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, Bölüm 2 vb. tarzında olacaktır ve yapılan değişiklikler başta yer alacaktır.
BÖLÜM 1
-
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.
Solution Explorer penceresinde;
KIRMIZI kutucuk içindekiler bizim Katmanlarımız:
ReCap.Business, ReCap.ConsoleApp(Şuanlık UI yerine kullanılıyor), ReCap.DataAccess, ReCap.Entities
Sarı kutucuk içindekiler bizim Abstract klasörümüz:
Interface'lerin yer aldığı kısım
Mor kutucuk içindekiler bizim Concrete klasörümüz:
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.
Turkuaz kutucuk içindeki bizim Console(şuanlık UI) olarak kullandığımız kısım:
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.
SQL Server Object Explorer penceresinde;
Koyu Pembe:
Database Adı: ReCapDB
Açık Pembe:
ReCapDB'de yer alan tablolarımız: Cars, Brands, Color
Bu tabloları oluşturmak için ReCapDB -> Mouse Sağ Click -> New Query
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);
SQL kodlarını direkt kullanmak isterseniz;
-Tablo eklemek için;
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)
)
-Tablolara veriler eklemek için;
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');
BÖLÜM 2
-
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.
Bu engeli aşmak için de tabiki bir çözüm var.
İlk önce neden kendi tablomuzu yapmayı düşünmeyelim?
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.