8 Temmuz 2013 Pazartesi

Repository Pattern

      Birgün nette gene face senin youtube benim takılırken sana yıllar evvel free lance iş bulma sözü veren bir arkadaşın arıyor ve elinde çok büyük bir iş olduğunu söylüyor , bu işi yapmak için en uygun kişinin sen olduğunu söylüyor . Sen tabi bir pozlara falan giriyorsun :)  Analiz toplantılarına  katılıyorsun. müşteri şu anda mssql server ile çalışacaklarını ama belki bi gün oracle'a ya da mysql'e geçebileceklerini belirtiyor ve yapılacak yazılımın herhangi bir Database değişiminden en az etkilenmesi gerektiğini söylüyor.Sen tabi olur, yaparız , yazılımcıyız biz herşeyi yaparız havalarına giriyosun . Aklına birsürü şey geliyor şöyle yaparım böyle yaparım diye o gece uyuyana kadar düşünüyorsun ve tabi ki doğru düzgün birşey çıkmıyor :) Hafiften stresse giriyorsun, uykuya daldığın anda ıssız bir çölde buluyorsun kendini , karşıdan aksakallı Martin Fowler yanına yaklaşıyor ve sana bişeyler anlatmaya çalışıyor sende ona doğru gidip  "ne diyon sen dayı?" diyorsun . Ses netleşiyor ,"Repository Pattern" dediğini duyuyorsun. sen "o da neymiş" demeye kalmadan yapıyor reklamını  "Patterns of Enterprise Application Architecture" kitabım sayfa bilmem kaçı aç göreceksin diye :)

        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.
         Sıra geldi kullanacağım veritabanın işlemlerini yapacağım  repository classını yazmaya, isimlendirme yaparken hangi veritabanı kullandığımını prefix olarak eklersem daha sonra hatırlamam açısından daha iyi olur.Eklediğim repository sınıfına interface'ide implemente ediyorum böylece doldurmam gereken metodlar geliyor.

 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:)

 

4 yorum:

  1. Ahahha :) yorumlamana bayıldım.

    YanıtlaSil
  2. Valla süper bir yaklaşım :)

    YanıtlaSil
  3. çok güzel yorum akıcı faka sıkıcı değil :D

    YanıtlaSil
  4. Abi anlayamadığım design patternleri anlıyorum sayende sağol

    YanıtlaSil