Ahmet Oğuz Koca

Sosyal olaylar.

Entity Framework'te Jenerik Repository kullanımı

Bilindiği üzere büyük ölçekli (multi tier/layer) uygulamalarda DRY (don’t repeat yourself/kendini tekrar etmeme) prensibini etkin şekilde kullanarak proje içindeki kod tekrarlarının önüne geçmek çoğu zaman mümkün olamayabiliyor. Özellikle de veri tabanı merkezli (database centric) uygulamalarda farklı entityler (tablo/class) üzerinde işlemler yaparken sık sık kod tekrarları (çoğu zaman where ve orderby sorguları) yapmak durumunda kalabiliyoruz. Bu durumda da proje sonunda elimizde onlarca benzer fonksiyon ve class’tan oluşan yapılar kalabiliyor. Bu da projelerde hem kodlama (harcanan zaman ve emek) hem de bakım (maintenance) maliyetini arttıran bir faktör olarak karşımıza çıkıyor.

Aslında C# dilinin gelişimi sürecinde dile eklenen yeni yöntem ve isim uzaylarını (namespace) etkin şekilde kullanarak bu tekrarların önüne geçmek mümkün. İlk bakışta dilin temel söz diziminin (syntax) ötesine geçmesinden dolayı okunabilirlik konusunda zorlukları olsa da bir kaç alıştırmadan sonra siz de bu yöntemleri öğrenip projelerinize kolaylıkla entegre edebilirsiniz.

Ben de bu yazıda linq ve jenerikler yardımıyla bir repository sınıf oluşturucak ve modelimizdeki tüm entitylerimiz üzerinde başka bir sınıfa ihtiyaç duymadan istediğimiz işlemleri nasıl yapabileceğimizi anlatıyor olacağım. Konuyu oldukça basit tutmak amacıyla iki farklı sınıf (entity) üzerinde duracağız ancak jenerik repository kullanmanın faydalarının farkına projemizdeki entity sayısı arttıkça daha fazla varabiliriz.


Basitleştirilmiş iki entitymiz şu şekilde olsun

 Yine repository sınıfımızında oldukça basit ve anlaşılabilir olması amacıyla yazdığım kodları mümkün olduğu kadar basitleştiriyorum, sizler kendi ihyitaçlarınız doğrultusunda sınıfı istediğiniz kadar esnekleştirebilir ve genişletebilirsiniz. Genelikle Repository Class’imiz başka bir interface’den türetilir ancak konuyu başka bir bağlama (Dependency Injection v.s.) çekmemek amacıyla ben temel sınıf (base class) olarak oluşturacağım. Genel mantığını anladıktan sonra kullandığınız tasarım desenlerine göre kendinize özel repository sınıfınızı yazabilirsiniz.

Sınıfta gerekli gördüğüm yerlerde açıklamalar ekledim.

Repository sınıfımız

Repository sınıfımızdan sonra bu sınıfımızı kullanan istemci (client) kodlarımıza geçelim...

Kaynaklar:

http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

http://geekswithblogs.net/seanfao/archive/2009/12/03/136680.aspx

Loading