.Net Core Eğitimleri

6-) Generic Repository ve UnitofWork

Başlarken

Önceki derslerde projemizde code first ile veritabanı tasarımı yapmıştık. Peki bu tablolar üzerinde CRUD(Create, Read, Update, Delete) işlemlerini nasıl yapacağız? Eğer klasik yöntemleri kullanacak olsaydık yüksek ihtimal ile her bir entity için ayrı ayrı yönetim sınıfları oluşturacak ve aynı kodları tekrar tekrar yazacaktık. Bu dersimizde Generic Repository ve UnitofWork desenlerini projemize dahil edeceğiz.

Generic Repository ve Unitofwork

Yazılım geliştirmede en önemli konulardan bir tanesi ortak noktaları görmek ve tekrarlı kod yazmaya yönelten tasarımlardan uzak durmaktır. Tüm entity lerimizde yapacağımız işlemler temelde aynı. Hepsinde ekleme, silme, seçme, güncelleme işlemleri yapacağız. Tabiki her entity’nin business ile ilgili ekstra kodları olacaktır ancak o kodlar o entitye özel olacağı için tekrarlı kod yazmak anlamına gelmeyecek sadece bir kez yazılacaklardır.  Repository pattern ile bu ortak işlemleri generic bir sınıf oluşturarak tek bir noktadan yürütebiliriz. Üzerinde CRUD işlemler yapmak istediğimiz entity sınıfımızı generic type olarak Repositorye gönderdiğimizde geri sadece yapmak istediğimiz işin komutunu vermek kalacak. Biz bu uygulamamızda Generic Repository ve UnitofWork alt yapısını kullanacağız. Repository bizim için yapılacak işleri bir kuyruğa ekleyecek ve zamanı geldiğinde unitofwork bu kuyrukta bulunan işlerin veritabanında gerçekleşmesini sağlayacak. Unitofwork genellikle sıralı işlere sahip uygulamaların alt yapısında kullanılmaktadır.

Günlük hayattan bir örnek vermeye çalışırsak bir oto kuaförümüz olduğunu varsayalım, işletmemizin cilalama, iç yıkama ve dış yıkama hizmetleri olsun. Her bir hizmeti yapmak için ayrı bölmelerimiz olduğunu varsayalım(İç yıkama alanı, dış yıkama alanı, cilalama alanı). Ödemeyi almadan da hizmet vermiyoruz. Müşteriler araçları getirdiğinde onları bizim Repository Ahmet karşılayacak  ve araca ne işlem yapılması gerektiğini öğrenerek ilgili hizmetin bölmesinde aracı sıraya sokacak(A aracına iç yıkama, B aracına cilalama .. vs). Burada dikkat etmemiz gereken husus araçlara henüz işlem yapılmadı ama işlem yapılmak üzere etiketlendi ve kuyruğa eklendi. Bu arada unitofwork Hasan ödemesi yapılan yani SaveChanges işlemini yapmış müşterilerin araçlarını gerekli işlemleri yapmak üzere ilgili bölümlere yönlendirecek ve artık fiziki olarak hizmet tamamlanmış olacak. Böylece bu işlemleri izole ettik ve birbirinden ayırdık. Herkes kendi işini yapıyor ve yönetilmesi daha kolay bir yapı ortaya çıkıyor. Zorlarsak kabaca bu şekilde bir yapı var diyebiliriz. :)

IGenericRepository Arayüzü

Şimdi Repository için önce bir Interface oluşturacağız ve repository içinde yapılmasını istediğimiz işlemlere ait metotların imzalarını tanımlayacağız. Interfacelerde metotların body’leri olmaz sadece ve sadece imzaları dediğimiz kısım yani ne parametre aldıkları ve ne cevap döndükleri bilgisi bulunur. Interface oluşturmak için aşağıdaki ekran görüntüsünü takip edebilirsiniz.

Generic Repository Interface'inin eklenmesi - Mehmet Ali EROL
Generic Repository Interface’inin eklenmesi

Common projemiz içerisinde bulunan Repository klasörüne sağ tıklayarak “Add –> Class” diyoruz.

Generic Repository Interface'inin eklenmesi 2 - Mehmet Ali EROL
Generic Repository Interface’inin eklenmesi

Açılan ekranda nesne tipi olarak interface seçiyoruz ve Name alanına IGenericRepository yazarak kaydediyoruz.

Eklediğimiz IGenericRepositoru interface’ine çift tıklayarak dosyayı açıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

GenericRepository Sınıfı

Artık projemizde kullanacağımız Repository nin hangi metotları içermesi gerektiğini biliyoruz. Sıra GenericRepository sınıfımızı oluşturmaya geldi.

Generic Repository sınıfının eklenmesi - Mehmet Ali EROL
Generic Repository sınıfının eklenmesi

Repository klasörüne sağ tıklayarak tekrar “Add –> Class” diyoruz.

Generic Repository sınıfının eklenmesi 2 - Mehmet Ali EROL
Generic Repository sınıfının eklenmesi 2

Daha sonra açılan ekrandan nesne tipini class olarak seçiyoruz ve Name alanına GenericRepository yazarak kaydediyoruz.

Oluşturduğumuz GenericRepository.cs dosyasına çift tıklıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

IUnitofWork Arayüzü

Repositoryden sonra sırada UnitofWork sınıfı var, bu sınıfı oluşturmak için yine bir interface ekleyerek metot imzalarımızı yazacak ve bir unitofwork sınıfında neler bulunması gerektiğini belirteceğiz. Bu kez Common projemiz altında bulunan UnitofWork klasörüne sağ tıklıyoruz ve “Add –> Class” dedikten sonra nesne tipi kısmından interface’i seçip Name alanına IUnitofWork yazarak kaydediyoruz.

Oluşturduğumuz IUnitofWork.cs dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz.

UnitofWork Sınıfı

Son olarak UnitofWork sınıfımızı oluşturacağız, bunun için UnitofWork klasörüne sağ tıklayarak “Add –> Class” diyoruz ve Name alanına UnitofWork yazarak kaydediyoruz.

Unitofwork.cs dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz.

Generic Repository ve Unitofwork dersi sonucunda SolutionExplorer görüntüsü - Mehmet Ali EROL
Generic Repository ve Unitofwork dersi sonucunda SolutionExplorer görüntüsü

Buraya kadar yaptığımız işlemleri doğru yaptı iseniz Solution Explorer üzerinde aşağıdaki gibi bir görüntü görüyor olmanız gerekiyor.

Kontrol etmek isterseniz projenin son haline github sayfam üzerinden bu link ile ulaşabilirsiniz. Sormak istediğini herhangi bir soru var ise yorumlar kısmından ya da mail adresim üzerinden bana ulaşabilirsiniz.
Mail Adresim : mehmetalierol@windowslive.com

<- Önceki Post – Sonraki Post ->

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir