Nis
2
2013

Repository Pattern Öğreniyorum 1

Merhaba Arkadaşlar,

Repository patterni  iki makale şeklinde anlatmaya çalışacağım.  Bunu yapmamın sebebi ise makalenin  çok uzun olmasını engellemek için.  Çok  uzun makaleleri sevmiyorum ve insanın hevesini kaçırdığını düşünüyorum.

Repository patternin  bana ne faydası olacak  ben  repository patternin  neden kullanmalıyım  gibi aklımıza ilk gelebilecek soruların cevabını vermek gerekir ise  daha az ve daha temiz kod yazmak için kullanabilirsiniz.

Nesneye yönelimli programalanın amaçlarından biride  benzer kodları tekrar tekrar yazmak yerine bir yere yazıp onu kullanmaktır.  Yani benzer kodları tekrar yazmaktan bizi kurtarak hem projemizin kodunun anlaşılır olması ve zamandan tasarruf etmemize neden olur.

Bir uygulama geliştiriyorum ve uygulamada çok sayıda tablom var.  Entity Framework  orm aracını kullanıyorum ve tablolarımı entityler şeklinde projeme dahil ediyorum.  Benim  tablolarda   listeleme , ekleme veya güncelleme gibi    işlemlerim ortak sadece entity ismi değişiyor. Hepsine ekleme veya güncelleme  kodlarını tek tek yazmak ne kadar uzun sürecektir siz tahmin edin.  Projemizde çok  fazla kod olacaktır ve anlaşılabirliğini  düşürecektir projenin.   Respository patternin  bize sağladığı fayda generic metotlar yazarak  her işlem yapmak için tekrar tekrar kod yazmamızı engeller.
Ne kadarda güzel :)

İlk olarak basit bir  deneme yapmak için   bir deneme veritabanı  oluşturalım.

repository veritabanı1

id olan alarlar int tipinde diğerleride string tipinde. Ayrıca Sirket id  ile  Personel Sirketid  ilişkilidir.

Sonra Visual Studio açarak  New Proje ->  Other Project Types blank solution açıyoruz.

Blank Solutiona iki adet Class Library ve bir adette Wpf Application porjesi ekliyoruz. Katmanlı mimariyi kullanmaya çalışacağız.

 

Repository project

EF.RP olarak isimlendirdiğimiz blank solutionımıza Class library olarak busines ve data katmanını wpf application olarakta client ön yüzümüzü ekliyoruz.

İlk olarak  EF.Data class library sağ tıklayarak add new ıtem-> ADO.NET Entity Data Model ->Deneme veri tablosuna bağlanıp personel ve şirket ismindeki tabloları ekliyoruz.

Daha Sonra EF.Bussines katmanına gidip Refence kısmında  EF.Data referans veriyoruz.

Repository reference

 

Şimdi geldik asıl iş yapacak yere  Repository adlı bir class oluşturup generic metotlarımızı yazıyoruz.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using EF.Data;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Data.Linq;

namespace EF.Bussines
{
    public class Repository<T> where T : class
    {
        ObjectContext _context;
        IObjectSet<T> _objectSet;

        //Context Oluşturuyoruz
        DenemeEntities db = new DenemeEntities();

        public Repository()
        {
            // ObjectContext nesnesi oluşturyoruz.
            _context = (ObjectContext)db;
            _objectSet = _context.CreateObjectSet<T>();
        }

        // Entity Göre listeleme yapan generic metodumuz
        public List<T> Listele()
        {
            List<T> liste = _objectSet.ToList();
            return liste;
        }

        // Lambda syntax kullnarak sorgularımızı yaptığımız metot
        public List<T> SorguyaGoreListele(Expression<Func<T, bool>> where)
        {
            return _objectSet.Where(where).ToList();
        }

    }
}

Şimdi EF.Client  projemizde hata almamak için App.config  ekleyerek EF.Data projesindeki connectionStrings eklemeyi unutmayalım. Daha sonra nuget package manager kullanarak. Projemize EntityFramework ekliyoruz. Nuget Package çok faydalı bir extensiondır. Buradan indirebilirsiniz.

nuget packages project

 

Tasarım ekranımızı  aşağıdaki gibi tasarlıyoruz.

respository wpf

 

MainWindow.xaml   Kodları

<Window x:Class="EF.Client.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" />
        <Button Content="Personel Getir" Height="23" HorizontalAlignment="Left" Margin="30,233,0,0" Name="button1" VerticalAlignment="Top" Width="103" Click="button1_Click" />
        <Button Content="Şirket Getir" Height="23" HorizontalAlignment="Left" Margin="270,233,0,0" Name="button2" VerticalAlignment="Top" Width="96" Click="button2_Click" />
        <Label Content="Listeme Yapmak Şirketin ID " Height="28" HorizontalAlignment="Left" Margin="12,269,0,0" Name="label1" VerticalAlignment="Top" Width="402" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="206,269,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
        <Button Content="Şirket  Personelinilerini  Getir" Height="23" HorizontalAlignment="Left" Margin="339,270,0,0" Name="button3" VerticalAlignment="Top" Width="164" Click="button3_Click" />
    </Grid>
</Window>

 

MainWindow.xaml   Kodları

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using EF.Bussines;
using EF.Data;

namespace EF.Client
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // Tüm Personelimiz Listeler
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Repository<Personel> ds = new Repository<Personel>();

            dataGrid1.ItemsSource = ds.Listele();
        }

        // Tüm Şirketleri Listeler
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            Repository<Sirket> ds = new Repository<Sirket>();
            dataGrid1.ItemsSource = ds.Listele();
        }

        // Gelen  Sorgulara Göre Listeleme Yapar
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            Repository<Personel> ps = new Repository<Personel>();

            int sirketid = Convert.ToInt32(textBox1.Text);

            dataGrid1.ItemsSource = ps.SorguyaGoreListele(p => p.Sirketid ==sirketid);
        }
    }
}

 

Personel Getir  Butonuna tıkladığımızda ekran görüntüsü.

 

Repository personel

 

Şirket Getir  Butonuna tıkladığımızda ekran görüntüsü.

 

repository sirket

 

Bir önceki resimdeki  id kısmına dikket ederseniz 1 numaralı id Temiz Kod çalışan personeli simgelemektedir.

Şirket Personellerini getir butonuna 1 yazıp sorgu yaptığımızda Temiz Kod çalışanlar gelecektir.

 

repository sirket sorgu

 

Repository pattern diğer makalesinde ekleme , silme , update gibi yani crud işlemlerine değiniyor olacağım. Umarım kısa ve yaralı  bir makale olmuştur.

 

Herkeze Kolay Gelsin.

Yazar Hakkında

Harun Balta 63 adet yazısı bulunuyor..

Bilgisayar Mühendisliği Üzerine çalıştığım konular: C# , .Net , Silverlight , WPF , Entity Framework ,MVVM, Oracle ,Pl/Sql

Print Friendly