NHibernate - INamingStrategy Implementation

21. November 2010

Merhaba,

Bu yazımda NHibernate'in pek bilinmeyen bir özelliğinden bahsedeceğim. NHibernate de pocolar için insert, update, delete ve select queryleri dinamik olarak üretilmektedir. Bu queryler oluşturulurken "poco_name.hbm.xml" dosyalarındaki table-class mapping bilgilerinden yararlanılır. Burada tablo ismi ve sütun isimleri alınarak bir query oluşturulur. 

Peki bu isimlendirmelere çalışma zamanında nasıl müdahele edebiliriz? Bunu INamingStrategy interface'ini implemente ederek yapabiliriz. Örneğin aşağıdaki sınıfı inceleyelim. 

 

public class NamingStrategyImpl : INamingStrategy
{
    public string ClassToTableName(string className)
    {
        return DefaultNamingStrategy.Instance.ClassToTableName(className);
    }

    public string PropertyToColumnName(string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToColumnName(propertyName);
    }

    public string TableName(string tableName)
    {
        tableName = tableName.ToUpper();

        return DefaultNamingStrategy.Instance.TableName(tableName);
    }

    public string ColumnName(string columnName)
    {
        columnName = columnName.ToLower();

        return DefaultNamingStrategy.Instance.ColumnName(columnName);
    }

    public string PropertyToTableName(string className, string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToTableName(className, propertyName);
    }

    public string LogicalColumnName(string columnName, string propertyName)
    {
        return DefaultNamingStrategy.Instance.LogicalColumnName(columnName, propertyName);
    }
}

 

Burda tableName, columnName vs. değerlerinin oluştuğu metodlar bulunmaktadır. Örneğin dinamik oluşturulacak query içinde tablo adı öncelikle poco_name.hbm.xml dosyasından okunur sonra burdaki TableName metoduna parametre geçilerek geri alınan değer kullanılır. Örnekte tablo ismi büyük harflere çevrilmiştir. Benzer şekilde tablo ismi üzerinde ihtiyaca göre çeşitli değişiklikler yapılabilir. Çalışan sistemlerde veritabanı değişikliklerinde bazen bu tür kodlar işimizi oldukça kolaylaştırabilir. 

Peki bu sınıfı yazdıktan sonra NHibernate kütüphanesinin bu implementasyonu kullanmasını nasıl sağlayacağız? Cevabı basit. SessionFactory nesnesi oluştururken. Örnek kod aşağıdadır.

 

var config = new Configuration();
config.SetNamingStrategy(new NamingStrategyImpl());
_SessionFactory = config.Configure().BuildSessionFactory();

Kolay gelsin

 

.Net, NHibernate , ,

Extension Methods

19. November 2010

Merhaba,

C# 3.0 ile gelen yeni bir özellik olan Extension Method'dan bahsedeceğim. Extension metodlar tiplere sonradan yeni metodlar kazandırmaya yarıyor. Bu kendi tiplerimiz olabileceği gibi herhangi bir system tipi de olabilir. Örneğin string sınıfına aşağıda long tipine dönüşüm sağlayan extension metod yazılmıştır. 

 

namespace System
{

    
public static class StringExtensions
    {

        
/// <summary>
        
/// String'in degerini long'a convert eden metod.
        
/// </summary>
        
/// <param name="t">Tip</param>
        
/// <returns>long deger</returns>
        
public static long ToLong(this string t)
        {
            
return Convert.ToInt64(t);
        }
    }
}

 

Bu metod şu şekilde kullanılabilir: 

 

String str = "30";
long lng = str.ToLong();

 

Burada dikkat edilmesi gereken metodun static bir metod olması ve ilk parametre olarak extend etmek isteğimiz sınıf tipinde bir parametre almaktır. "this" anahtar sözcüğü tipin extend edileceğini gösterir. Bu şekilde istediğiniz her tipe yeni yeni özellikler kazandırılabilir.

Unutmadan dikkat edilmesi gereken bir nokta, extension metodu kullanmak istediğiniz yerde mutlaka using ifadesi ile extension metodun olduğu namespace'i dahil etmelisiniz. Küçük bir ipucu: örnekte olduğu gibi namespace'i System yaparsanız otomatik olarak heryerde erişim sağlamış olursunuz. 

http://www.extensionmethod.net/ adresindeki hazır yazılmış extension metodları kullanabilirsiniz. Hatta kendi yaptıklarınızı da yayınlayabilirsiniz.

.Net , ,

Type.GetType(String typeName) Metodu

19. November 2010

Merhaba,

Bu entryde Type.GetType metodunun başka bir assemblydeki bir sınıf için nasıl kullanılması gerektiğinden bahsedeceğim. 

C# da reflection kullanan herkesin mutlaka kullandığı bir metoddur Type.GetType(). Kısaca açıklamak gerekirse namespace+className'ini bildiğimiz bir sınıfın tipini elde etmeye yarar. Örnek verecek olursak;

Type t = Type.GetType("Namezpace.ClassName");

 

ifadesi "ClassName" sınıfının tipini döndürür. Fakat ilgili tip başka bir assembly'de ise null döner. Bu durumu çözmek için aynı string içinde virgül ile ayırarak assembly adı da verilmelidir. Yani;

Type t = Type.GetType("Namezpace.ClassName, AssemblyName");

şeklinde yazılmalıdır. 

.Net , , ,

BlogEngine.Net için gmail ayarları

15. November 2010

    Merhaba, 

    BlogEngine kurulumunda ilk yaşadığım sorun gmail ayarlarını yapmak idi. Aşağıda gmail'den aldığım ayarlar var ama bunları yapmak yeterli olmuyor. Ek olarak uygulamanın web.config dosyasında System.Web section'i altında 

    <trust level="Full" /> 

    şeklinde bir tag yer almalı. Kolay gelsin.


    Gelen Posta (POP3) Sunucusu - SSL gerektirir: pop.gmail.com
    SSL Kullan: Evet
    Bağlantı Noktası: 995
    Giden Posta (SMTP) Sunucusu - TLS gerektirir: smtp.gmail.com (kimlik doğrulaması kullan)
    Kimlik Doğrulaması Kullan: Evet
    STARTTLS Kullan: Evet (bazı istemciler bunu SSL olarak adlandırır)
    Bağlantı Noktası: 465 veya 587
    Hesap Adı: Gmail kullanıcı adınızı girin (@gmail.com dahil)
    E-posta Adresi: tam Gmail e-posta adresiniz (kullaniciadi@gmail.com)
    Şifre: Gmail şifreniz

 

BlogEngine

Sonunda blog dünyasına döndüm

8. November 2010

Merhaba,

Ben Yıldız Teknik Üniversitesi, Bilgisayar Mühendisliği bölümünden 2009 yılında mezun oldum. 2008'den beridir piyasada çalışmaktayım. Şuan SmartSoft bünyesinde yazılım uzmanı olarak çalışıyorum. Şirket dışında da halen heyecanla kod yazıyorum. Bireysel olarak geliştirdiğim birçok projem var. Onları da zamanla burada paylaşıyor olacağım. 

 

 

 

Genel