Yazılım Mimarileri ve Tasarım Desenleri Üzerine

C# N-Tier Architecture(Çok(n) Katmanlı Mimari)

Bu yazımda C#’ta çok katmanlı mimari yapısından bahsedeceğim.Kodlamalar sırasında işimizi kolaylaştıracak katmanlar mevcuttur.Genelde üç katman yapısı standarttır.İhtiyaca göre katman sayısı arttırılıp azaltılabilir.Çok katmanlı mimarinin tercih edilme nedeni proje yönetiminin kolay olması,ekip çalışmasına uygun olması,hata yönetiminin kolay olması vs. gibi nedenlerden tercih edilir..Şimdi gelin bu katmanlar nedir, nasıl kullanılır görelim.

Genel olarak standart üç katman vardır demiştim.Ben bu yazımda bu standart katmanları tanıtacağım.

Genel prensip, veritabanı işlemleri DAL tarafından, o veritabanının kullanılıp data manipülasyonlarının yapılması işlemi de BL tarafından yapılmalı ve sonuçlar PL ye gönderilmelidir.Sunum katmanın da,kod arkasında sadece verilerin gösterilmesini sağlayan kodların yazılması makbuldür.Yani sunum katmanın da veritabanı ile ilgili hiçbir işlem olmamalıdır.
Bu katmanlar oluşturulurken klasörler içinde oluşturulabileceği gibi, eğer birden fazla projede kullanılması hedefleniyorsa dll ler olarakta oluşturulabilirler.Yazacağımız uygulamayla ilgili bilgi vermek gerekirse Northwind tablosunda çalışacağız.PersonelId,Adi,SoyAdi,Unvan ve Sehir kolonlarını çekeceğiz.
Şimdi bu katmanların nasıl kullanıldığına sırasıyla bakalım.
DAL(Data Access Layer)-Veri Erişim Katmanı için bir sonraki sayfaya geçiniz.

DAL(Data Access Layer)-Veri Erişim Katmanı
Bu katman da sadece database işlemleriyle uğraşılır.
Bu katman DAL.cs sayfasın da hazırlanacaktır.

--DAL.cs--
    class DAL
    {
        public SqlConnection BaglantiAc()
        {
            SqlConnection baglanti = new SqlConnection("Server=GENÇAY-GENÇAY;database=Northwind;trusted_connection=true;");
            baglanti.Open();
            return baglanti;
        }
//SqlConnection tipinden geri dönen metod.
        public SqlCommand SorguOlustur(string sorgu)
        {
            SqlCommand cmd = new SqlCommand(sorgu,BaglantiAc());
            return cmd;
        }
//SqlCommand tipinden geri dönen metod.
    }

DAT katmanın da oluşturduğumuz veritabanı nesnelerini,BL katmanın kullanalım.
BL(Busines Layer)-İş Katmanı için bir sonraki sayfaya geçiniz.
BL(Busines Layer)-İş Katmanı
Adından da anlayacağımız gibi bu katman iş katmanıdır.Bu katman da bağlanılan veritabanın da ki veriler düzenlenecektir.Bu katman da verileri tutmak için ben Personeller classı oluşturuyorum.Ve Personeller clasına bu katman da verileri aktaracağım.
Bu katman BL.cs sayfasın da hazırlanacaktır.

--Personeller.cs--
    class Personeller
    {
        public int PersonelId { get; set; }
        public string PersonelAdi { get; set; }
        public string PersonelSoyadi { get; set; }
        public string PersonelUnvani { get; set; }
        public string PersonelSehri { get; set; }
        public Personeller() { }
//Bir tane boş constructor oluşturuyorum.Referans adından propertylere değer aktarılabilsin diye.
        public Personeller(int PersonelId,string PersonelAdi,string PersonelSoyadi,string PersonelUnvani,string PersonelSehri)
        {
            this.PersonelAdi = PersonelAdi;
            this.PersonelId = PersonelId;
            this.PersonelSehri = PersonelSehri;
            this.PersonelSoyadi = PersonelSoyadi;
            this.PersonelUnvani = PersonelUnvani;
        }
//Bir tanede parametre alan constructor oluşturuyorum.Nesne oluşturulur oluşturulmaz propertylere değerler gönderilebilsin diye.Duruma göre istenen Constructor kullanabilirsiniz.
    }

Yukarıda Personeller classı oluşturulmuştur.DAL’da bağlandığımız veritabanından ,BL katmanında Ad,Soyad,Unvan ve Sehir kolonlarını çekeceğim.Bu kolonları ilgili propertylere aktarıp bilgileri tutacağım.
Şimdide BL.cs katmanını oluşturalım.

--BL.cs--
    class BL
    {
        public List VerileriCek()
        {
            List personeller = new List();
            DAL BaglantiYapVeCalistir = new DAL();
            SqlConnection baglanti = BaglantiYapVeCalistir.BaglantiAc();
            SqlCommand cmd = BaglantiYapVeCalistir.SorguOlustur("Select PersonelId,Adi,SoyAdi,Unvan,Sehir from Personeller");
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            while (dr.Read())
            {
                Personeller personelim = new Personeller();
                personelim.PersonelAdi = dr["Adi"].ToString();
                personelim.PersonelId = (int)dr["PersonelId"];
                personelim.PersonelSehri = dr["PersonelSehri"].ToString();
                personelim.PersonelSoyadi = dr["SoyAd"].ToString();
                personelim.PersonelUnvani = dr["Unvan"].ToString();
                personeller.Add(personelim);
            }
            baglanti.Close();
            return personeller;
        }
    }

Yukarı da gördüğünüz gibi BL katmanın da verilerimizle işlem yaparken DAL katmanın da oluşturduğumuz veritabanı metodlarını kullanıyorum.
PL(Presentation Layer)-Sunum Katmanı için bir sonraki sayfaya geçiniz.
PL(Presentation Layer)-Sunum Katmanı
Bu katman sunum katmanıdır.Bu katmanın kod kısmında veritabanı bilgilerini gerekli kontroller de göstermeye yaracak kodlar bulunmalıdır.Bu kodları da BL katmanın da bulunan metodlardan çekeceğiz.Yani BL’de çekilecek verilerle ilgili işlemler yapılıp,çekilir.PL de ise bu veriler gösterilir.Şimdi formumuza bir tane DataGridView nesnesi ekleyelim.
Bu katmanı PL.cs sayfasında oluşturabilirsiniz.Ancak ben Visual Studio nun varsayılan sunum katmanı olan Form1.cs sayfasında oluşturacağım.

--Fom1.cs--
        private void Form1_Load(object sender, EventArgs e)
        {
            BL vericek = new BL();
            dataGridView1.DataSource=vericek.VerileriCek();
        }

Projeyi derleyip çalıştırdığınız da, DataGridView nesnesine çektiğimiz verilerin geldiğini göreceksiniz.
Son olarak özetlersek,
Büyük ya da küçük çaplı projelerinizde bu standart katmanları kullanmanızı tavsiye ederim.Hem kod karmaşasını engelliyor,hemde aldığımız hataların nedeni daha anlaşılır oluyor.Kısada DAL’ı BL kullanır.BL’yi de PL katmanı.Hiyerarşi bu.

Umarım faydalı olabilmişimdir.Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar.

Exit mobile version