Generic Repository Desing Pattern

Repository temel olarak veritabanı sorgulama işlemlerinin bir merkezden yapılmasını sağlayarak iş katmanına bu işlerin taşınmasını önler bu şekilde sorgu ve kod tekrarına engel olmuş olur. Asıl amaç veri işlem ve sorgulamaların tekrarlardan kaçınılarak merkezi bir yapıya çekilmesidir. Repository Desing Pattern ilk ve önemli budur bunun yanında programımızda asıl işi yapan bölümler ile veriye erişen bölümlerin birbirinden soyutlanması mantığı da geliştirilmiştir. Bu sayede bir nebze olsun güvenlik zaafiyetinin önüne geçmiş olacağız.

Repository dediğimiz kalıp nedir? Neler içermelidir?

Repository tanım gereği objeler içeren collection yapısındadır. Bu objeler memory'de tutulu ve objelere erişmek için collection nesnesinde kullandığımız bazı ortak metodları kullanırız.Bu metodlar add, remove, get, getAll olarak örneklendirebiliriz. Dikkat edilirse "SAVE ve UPDATE" bulunmamaktadır. Bunun nedeni repository bir obje koleksiyonu olduğundan görev veritabanı güncellemek veya ona bişeyler eklemek değidir.

Repository Pattern Nasıl Kullanılır

Projemizi açtıktan sonra child sınıflara kalıtım vermek için "IBaseEntity" interfacesini açıyoruz ve Tip bağımsız "Id" tanımlıyoruz.

Daha sonra "BaseEntity" adında açtığımız ata sınıfımıza "IBaseEntity"'den kalıtım veriyoruz ve interfacemizin içindekileri implement yoluyla "BaseEntity" veriyoruz. Burada diğer child sınıfların besleneceği property tanımlıyoruz.

AppUser adında açtığımız child sınfımıza ata sınıfımız olan BaseEntity tanımlıyoruz ve sadece bu sınıfa özgü olacak property'leri ekliyoruz.

İhtiyacımız olan diğer sınıfları da aynı resimde göründüğü gibi Concrete klasörümüze ekliyoruz ve hepsine tek tek ata sınıfımız olan BaseEntity'yi tanımlıyoruz.

Şimdi geldik Repositoryleri eklemeye... ilk olarak Data katmanında açmış olduğumuz Repositories klasörümüzün altına interface klasörü açıp IBaseRepositories adında bir interfaces açacağız bu interface bize diğer sınıflara kalıtım vererek yazılan metodların tekrarını engelleyecektir ve her defasında tek tek bunları yazmak yerine tek bir noktadan yönlendirilecektir. Ayrıca bu interface'mize ata sınıfımız olan Base Entity'de tanımladık ve aynı zamanda bütün metodlarımızı Tip bağımsız olarak geçtik.

BaseRepository adında bir class açtık ve IBaseRepository'den implemen yolu ile tanımladığımız methodlarımıza gövde kazandırdık.

EfAppUserRepository classımıza BaseRepository'i AppUser tipinde tanımladık. Bundan sonra artık EfAppUserRepository inject ettiğimiz her yerde AppUser sınıfıızın bütün özelliklerini kazandırmış olduk ve istediğimiz doğrultuda kullanıma hazır hale gelmiş oldu.

Last updated