Sende kan ter içinde uyanıyorsun (neden kan ter içinde uyanıyorsan artık :)) hemen tabi repository pattern yazıyorsun google'a ve aramaya başlıyorsun (adam Kitabının ismini bile vermiş ne diye hala başka yerlerden öğrenmeye çalışıyorsun o da ilginç :)) ve buraya kadar sürükleniyorsun neyse lafı çok çok uzattık hemen işe koyulalım.
Örnekte sadece ürün classım olacak;
class Urun
{
public int Id { get; set; }
public string Ad { get; set; }
}
Amaçtan sapmamak adına fazla property tanımlamadım. Şimdi yapmam gereken IUrunRepository isimli interface'i tanımlamak.
interface IUrunRepository
{
void UrunEkle(Urun urun);
void UrunSil(Urun urun);
void UrunGuncelle(Urun urun);
Urun dKategoriyeGoreUrunGetir(int id);
List<Urun> TumUrunleriGetir();
}
Veritabanına etki edecek metodlarımı interface'de tanımladım.
class MssqlUrunRepository : IUrunRepository
{
void UrunEkle(Urun urun)
{
//Sql ile ürünü vt'ye kaydetme komutu
}
void UrunSil(Urun urun)
{
//Sql ile ürünü vt'den silme komutu
}
void UrunGuncelle(Urun urun)
{
//Sql ile ürünü güncelleme komutu
}
Urun dKategoriyeGoreUrunGetir(int id)
{
//Sql ile Id'ye göre vt'den ürün getirme komutu
}
List<Urun> TumUrunleriGetir()
{
//Sql ile vt'den ürünleri getirme komutu
}
}
Ve işte bu kadar . Artık veritabanı işlemlerini core metodlarında değilde repository classımda yapacağım böylece herhangi bir veritabanı değişikliğinde tek tek core metodlarımın içinde nerede veritabanı işlemleriyle uğraşmışım aramaya gerek kalmayacak, mesela mysql e geçtiysem MySqlUrunRepository classı yazıp IUrunRepository interface'ini implemente etmem, metodların içlerini mysql veritabanına uygun doldurmam ve bir de core işlemlerini yaptığım yerde MsSqlUrunRepository yerine MySqlUrunRepository kullanmam yeterli olacak.
Artık sende projende repository pattern kullanarak veritabanı değişikliğini asgari maliyetle atlatabilirsin:). Ayrıca Generic bir base repository sınıfı oluşturup create,update,delete gibi her repository classına eklediğin metodları bu generic base class ta tanımlaman seni tekrarlayan işleri yapmaktan kurtaracaktır.
Bunu yaptım da peki ben şimdi core kısmında kullanacağım bütün repositorylerin tek tek instance'ını mı alacağım ayrıca iyi güzel anlattın da transactional işlemleri sıkıntılı gibi duruyor onu nasıl hallederiz diyorsan o zaman Ak sakallı Martin Fowler'ın sana başka bir süprizi daha var;
Unit Of Work:)
Ahahha :) yorumlamana bayıldım.
YanıtlaSilValla süper bir yaklaşım :)
YanıtlaSilçok güzel yorum akıcı faka sıkıcı değil :D
YanıtlaSilAbi anlayamadığım design patternleri anlıyorum sayende sağol
YanıtlaSil