31 Ağustos 2010 Salı

Veritabanından okunan tip bilgisine göre nesne yaratma

Merhaba, bir önceki yazımda Linq To Sql Classes yöntemi ile veritabanı tablolarından otomatik olarak yazılım sınıfların yaratılmasını anlatmıştım. Şimdi aynı proje üzerinde biraz değişiklik yapıp veritabanından okunan sınıf adlarına göre çalışma zamanında nesneler oluşturacağız.

İlk olarak, bir önceki yazımda kullandığım projeye 3 adet yeni sınıf ve bir interface ekliyoruz. Bunlar; BronzeMusteri, AltinMusteri, PlatinMusteri sınıfları ve IMusteri interface'i .

IMusteri
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReflectionOrnek
{
    interface IMusteri
    {
        string Ad { get; set; }
        string Soyad { get; set; }
        string getMusteriBilgi();
    }
}

BronzeMusteri
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReflectionOrnek
{
    class BronzeMusteri:IMusteri
    {
        #region IMusteri Members
        public string Ad{get;set;}
        public string Soyad { get; set; }
        public string getMusteriBilgi()
        {
            return "Merhaba Ben " + Ad + " " + Soyad + " Ben bir Bronz Müşteriyim";
        }
        #endregion
    }
}

AltinMusteri
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReflectionOrnek
{
    class AltinMusteri:IMusteri
    {
        #region IMusteri Members
        public string Ad { get; set; }
        public string Soyad { get; set; }
        public string getMusteriBilgi()
        {
            return "Merhaba Ben " + Ad + " " + Soyad + " Ben bir Altın Müşteriyim";
        }
        #endregion
    }
}

PlatinMusteri
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReflectionOrnek
{
    class PlatinMusteri:IMusteri
    {
        #region IMusteri Members
        public string Ad { get; set; }
        public string Soyad { get; set; }
        public string getMusteriBilgi()
        {
            return "Merhaba Ben " + Ad + " " + Soyad + " Ben bir Platin Müşteriyim";
        }
        #endregion
    }
}

Tüm sınıflar IMusteri interface'ini uyguluyorlar. Bunun sayesinde her müşteri tipinin getMusteriBilgi metodunu implement ettiğinden eminiz ve polimorfizm sayesinde veritabanından tip bilgisi alınarak yaratılan her bir müşteri için getMusteriBilgi metodu farklı bir değer üretecek. Böylece gerçekten farklı tipte nesnelerin yaratıldığını anlayabileceğiz.

Gerekli sınıfları yarattıktan sonra önceden kullandığımız Data veritabanındaki Kisiler tablosuna aşağıdaki şekilde kayıtlar ekliyoruz. (Bu veritabanı ve tabloyu bir önceki yazımda anlatmıştım.)
 






Kisiler tablosundaki KisiTipi kısmı önemli, yaratılan nesne buradaki tip bilgisine göre yaratılıyor. Tip bilgisini ise: NamespaceAdı.SınıfAdı şeklinde yazıyoruz. (Bizim örneğimizde ReflectionOrnek.AltinMusteri vb...)

Son olarak, önceden kullandığımız Form daki butonun click eventini şu şekilde değiştiriyoruz.

private void btnGetKisi_Click(object sender, EventArgs e)
{
     //Linq kullanarak otomatik olarak tüm kişileri alıyoruz
     //Linq eşlemeyi kendisi yapıyor, biz sql yazmak yerine benzer olan linq
     //sorguları yazarak okuma yapıyoruz
     var kisiListesi = (from kisi in LinqToSql.Kisilers
                         select kisi).ToList();

     //Tipin Kisiler olması sizi yanıltmasın veritabanındaki Kisiler tablosundan otomatik olarak
     //yaratıldığı için bu şekilde, aslında tek bir kisiyi ifade ediyor.
     foreach (Kisiler k in kisiListesi)
     {
         //String olarak gelen müşteri tipi bilgisini Type'a çeviriyoruz
         Type t = Type.GetType(k.KisiTipi);

         //Elde ettiğimiz tip bilgisinden bir instance yaratıyoruz
         object newM = Activator.CreateInstance(t);

         //Oluşturulan instance ın IMusteri interface'ini implement ettiğine emin
         //olduğumuz için try catch yada "is" kullanmadan casting yapıyoruz
         IMusteri yeniMusteri = (IMusteri)newM;

         //Okunan bilgileri yeni oluşturulan instance'a atıyoruz
         yeniMusteri.Ad = k.Adı;
         yeniMusteri.Soyad = k.Soyadı;

         //Burada polimorfizm sayesinde yaratılan her nesne tipi kendine özgü bir
         //mesaj döndürecek
         MessageBox.Show(((IMusteri)newM).getMusteriBilgi());
     }
}

Activator.CreateInstance(t); ile istenen tipte nesne oluşturuluyor ve bu nesnenin getMusteriBilgi methodu çağrılıyor. İstenirse reflection sınıfları kullanılarak oluşturulan nesnenin sahip olduğu methodlar da elde edilebilir tabiki ama o kadarını buraya sıkıştırmak istemedim.

Bu konular hakkında, Microsoft yaz okulunda bizi bilgilendiren Fatih Boy hocama özellikle teşekkür ederim.

Projenin kodlarını buradan indirebilirsiniz.

Hiç yorum yok:

Yorum Gönder