Attribute ile Connection İşlemleri

Serhat tarafından yazılmıştır. 13. Mart 2010 11:49

Merhabalar herkese;
Bu yazımızda Attribute kavramının nimetlerinden yararlanarak projemizde ki farklı class'ların farklı veritabanları ile nasıl çalışacağına farklı bir bakış açısıyla bakacağız (=. Projemizde birden fazla sınıfın config dosyamızdan alacağı veritabanına erişeceğiz.Tek yapmamız gereken o sınıfın config dosyasında hangi bağlantıyı kullanacağını Attribute ile belirtmek olacaktır.

Öncelikle kodlama tarafına geçmeden önce sınıf diagramına bakalım ki kafamızda bazı şeylerin canlanması daha kolay olsun.Diagramın görünümü aşağıdaki gibidir.

-ConnectionAttribute sınıfımız bizim sınıflarımıza hangi veritabanına bağlanacağı bilgisini verirken kullanacak olduğumuz bir Attribute'dır.
-MyConnectionBase ve MySqlConnection sınıflarımız ise app.config dosyasında belirlemiş olduğumuz veritabanı connection bilgilerini okumamızı sağlayan classlarımızdır.MyConnectionBase sınıfının içerisinde ki Start() metodu ile config dosyasından tüm bağlantı bilgileri çekilir ve belleğe bağlantısı açılmış bir şekilde MySqlConnection tipinden koleksiyon olarak saklanmaktadır.Yani MySqlConnection sınıfı aslında bağlantı indeksi,bağlantı adı , connection cümleciği gibi bilgileri saklamamızı sağlayan bir nesne tasarımıdır.Config'de ki tüm connectionlar bu tipden saklanmaktadır ve MyConnectionBase içerisinde ki GetConnection ise application domain içerisinden parametre olarak almış olduğu tip adına adına ait olan Attribute'ları yakalarak Connection adına ait olan SqlConnection nesnesini geriye döndürmektedir.
-MySqlConnectionBase sınıfımız ise yazacağımız entity nesnelerimizin base'i olmaktadır.Base'de SqlConnection tipinden bir property bulunmaktadır ve o an çalışmış olduğu nesneyi property'nin içerisinde ki GetConnection metodu çalıştırılarak o tie ait olan SqlConnection bilgisi bellekten bize getirilmektedir.Bu durumda artık kendi entity nesnelerimiz içerisinde tekrardan connection string belirlemeden direkt MySqlConnectionBase'de ki SqlConnection property'si ile veritabanı işlemleri için gerekli olan bağlantı bilgilerini bize getirmektedir.

App.config bilgileri ise aşağıdaki gibidir.
 

Aşağıda ise programımız kodları bulunmaktadır.
--> ConnectionAttribute Sınıfı : App.Config'den bağlantı bilgilerini çekebilmek için System.Configuration dll'ni ve namespace'ini eklemek zorundayız !

[code:c#]
using System.Configuration;

namespace ConnectionTest
{
    [AttributeUsage(AttributeTargets.Class)]
    public class ConnectionAttribute : Attribute
    {
        public string Connection { get; private set; }
        public Dictionary<object, SqlConnection> ConnList { get; set; }

        public ConnectionAttribute(string value)
        {
            Connection = ConfigurationManager.ConnectionStrings[value].ConnectionString;
        }

        public ConnectionAttribute(int index)
        {
            Connection = ConfigurationManager.ConnectionStrings[ConfigurationManager.ConnectionStrings[0].Name == "LocalSqlServer" ? index + 1 : index].ConnectionString;
        }
    }
}

--> MyConnectionBase Sınıfı : Entity tipimize ait olan Connection bilgilerini bize getirmek için kullanacak olduğumu sınıfımızdır.

[code:c#]
    public static class MyConnectionBase
    {
        private class MySqlConnection
        {
            private int index;
            private string name;
            private SqlConnection connection;

            public SqlConnection Connection
            {
                get
                {
                    return connection;
                }
                set
                {
                    if (connection == value)
                        return;
                    connection = value;
                }
            }
            public int Index
            {
                get
                {
                    return index;
                }
                set
                {
                    if (index == value)
                        return;
                    index = value;
                }
            }
            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    if (name == value)
                        return;
                    name = value;
                }
            }
        }

        private static List<MySqlConnection> connList = new List<MySqlConnection>();

        static MyConnectionBase()
        {
            Start();
        }

        private static void Start()
        {
            for (int i = ConfigurationManager.ConnectionStrings[0].Name == "LocalSqlServer" ? 1 : 0; i < ConfigurationManager.ConnectionStrings.Count; i++)
            {
                MySqlConnection conn = new MySqlConnection() { Index = i, Name = ConfigurationManager.ConnectionStrings[i].Name, Connection = new SqlConnection(ConfigurationManager.ConnectionStrings[i].ConnectionString) };
                if (conn.Connection.State != System.Data.ConnectionState.Open)
                    conn.Connection.Open();
                connList.Add(conn);
            }
        }

        public static SqlConnection GetConnection(object obj)
        {
            object[] tipler = obj.GetType().GetCustomAttributes(false);
            for (int i = 0; i < tipler.Length; i++)
            {
                if (tipler[i].ToString() == "ConnectionTest.ConnectionAttribute")
                {
                    for (int j = 0; j < connList.Count; j++)
                    {
                        SqlConnectionStringBuilder left = new SqlConnectionStringBuilder(connList[j].Connection.ConnectionString);
                        SqlConnectionStringBuilder right = new SqlConnectionStringBuilder(((ConnectionAttribute)tipler[i]).Connection);
                        if (left.DataSource == right.DataSource && left.InitialCatalog == right.InitialCatalog && left.UserID == right.UserID)
                            return connList[j].Connection;
                    }
                }
            }
            return connList[0].Connection;
        }
    }

--> Entity Sınıflarımız  : İstenin tipe uygun bir class yazdıktan sonra o tip içinide veri için gerekli olan SqlConnection'u Connection adında ki Attribute ile belirliyoruz.Attribute'da vermiş olduğumuz değerler aslında config dosyasında connection string'leri saklayan bağlantı isimleridir !

 

[code:c#]

    [Connection("InvoiceSystem")]
    public class Fatura : MySqlConnectionBase
    {
        public Fatura()
        {
            SqlCommand cmd = new SqlCommand("Select TOP 10 * From İşlemler");
            cmd.Connection = SqlConnection;
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
                Console.WriteLine("Fatura Bilgisi :" + dr[0].ToString());
        }

    [Connection("YazilimWorks")]
    public class Urun : MySqlConnectionBase
    {
        public Urun()
        {
            SqlCommand cmd = new SqlCommand("Select TOP 10 * From Urun");
            cmd.Connection = SqlConnection;
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
                Console.WriteLine("Ürün Bilgisi :" + dr[0].ToString());
        }
    }
[/code]

Programımızı aşağıda ki gibi sınıflarımızdan bir nesne yarattığımızda ctor'dan connection'u alarak Urun ve Fatura sınıflarımız farklı veritabanlarına bağlanarak verilerimizi çekmektedir.

[code:c#]
        static void Main(string[] args)
        {
            Urun u1 = new Urun();
            Fatura f1 = new Fatura();
            Console.Title = "www.serhattas.net";
            Console.ReadLine();
        }


Programımızın ekran görüntüsü aşağıdaki gibidir.



Bu şekilde Attribute'ların programlarımız içerisinde ne kadar etkili olduğunu görmüş oluyoruz.

Proje örneğini indirmek için tıklayınız.

Faydalı olması dileğiyle :)
İyi Çalışmalar

Serhat TAŞ

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: ,

C# & .NET

Yorumlar

Yorum ekle


(Gravatar simgesini gösterecek)  

biuquote
  • Yorum
  • Canlı önizleme
Loading



Powered by BlogEngine.NET 1.4.5.0
Bu tema Mads Kristensen tarafından yapılmıştır ve Türkçeleştirilmesi Blog Engine Türkiye ekibi tarafından yapılmıştır.

Son Yorumlar

Comment RSS

Yasal Uyarı

Bu sitede sunulan tüm bilgi ve dökümanların kullanımından ve sitede yapılan kullanıcı yorumlarından (siyasi içerik,hakaret vb.) doğacak sorunlardan yazar sorumlu tutulamaz. 

İçeriğin kaynak belirtilmeden kopyalanması yasaktır !

SERHAT TAŞ

© Copyright 2010