Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Dependency Injection Tasarım Deseni (Unity)

Dependency Injection komponentlerin compile time da değil run-time da seçilmesini sağlayan tasarım desenidir.(Design Pattern) Bu desen örneğin dinamik olarak plug-in yükleyebilmek için , test ortamlarında mock nesnelerinin seçimini dinamik olarak yapmak için veya gerçek nesnelerin prod ortamında dinamik olarak oluşturulması için kullanılır. temeldeki mantığı Inversion of Control (IoC) ‘dür yani kontrollerin yer değiştirebilmesi. Aynı interface’den türeyen concreate sınıflar loose coupling sayesinde yer değiştirdiğinde sistemde herhangi bir değişiklik yapmadan yeni haliyle çalışabilir.
Kendisi nesneler arasındaki bağımlılığı azaltmak için güzel bir tasarım desenidir. (Bkz:Loose Coupling)
Bu deseni uygulamak için Ninject ve Microsoft Enterprise Library Unity Application Block ‘dan faydalanabilirsiniz.
Önemli bir nokta ise birbirinin yerine geçecek nesneler aynı interface’den türetilmek zorundadır.

Hemen bir örnek yapalım , Öncelikle genel sınıf ve interface’lerimizin bulunacağı bir class library oluşturuyoruz.
Unity Application Block’u kullanabilmek için Microsoft.Practices.Unity.Configuration.dll ve Microsoft.Practices.Unity.dll ‘lerini UI projemize eklememiz gerekiyor.

 public interface IHesap
    {
        int MusteriNo { get; set; }
        string HesapAdi { get; set; }
        string HesapTipi { get; set; }
        decimal Bakiye { get; set; }
    }

    public class Hesap : IHesap
    {
        public int MusteriNo { get; set; }
        public string HesapAdi { get; set; }
        public decimal Bakiye { get; set; }
        public string HesapTipi { get; set; }
    }

    public interface IHesapProvider
    {
        IHesap HesapTipiGetir();
    }

Daha sonra da run-time de oluşmasını istediğimiz component’ler için 2 adet class library projesi ekleyip içlerine 1er sınıf ekliyoruz.

</pre>
namespace CariHesapLibrary
{
 public class CariHesapProvider : IHesapProvider
 {
 public IHesap HesapTipiGetir()
 {
 Hesap h = new Hesap();
 h.HesapTipi = "Cari Hesap";
 h.Bakiye = 100;
 h.HesapAdi = "HesapAdim";
 h.MusteriNo = 6148976;
 return h;
 }
 }
}
<pre>
namespace DovizHesapProvider
{
 public class DovizHesapProvider : IHesapProvider
 {
 public IHesap HesapTipiGetir()
 {
 Hesap h = new Hesap();
 h.HesapTipi = "Doviz Hesap";
 h.Bakiye = 112;
 h.HesapAdi = "HesapAdim2";
 h.MusteriNo = 154030;
 return h;
 }
 }
}

Daha sonra da artık UI projemizde configden okuduğu değer ile bu 2 component’den birinin sınıfının yaratılmasını sağlayan sınıfımızı yazacağız.


public class HesapUygulama
 {
 private IUnityContainer container = new UnityContainer();

private IHesapProvider hesapProvider;
 public IHesapProvider HesapProvider
 {
 get
 {
 if (hesapProvider == null)
 {
 hesapProvider = container.Resolve<IHesapProvider>();
 }
 return hesapProvider;
 }
 set { hesapProvider = value; }
 }

public HesapUygulama()
 {
 UnityConfigurationSection unityConfig =
 (UnityConfigurationSection)ConfigurationManager.GetSection("hesap_unity");
 unityConfig.Configure(container);
 }

internal IHesap GetHesap()
 {
 return HesapProvider.HesapTipiGetir();
 }
 }

En sonunda bu sınıfı çağırıyoruz.


HesapUygulama uygulama = new HesapUygulama();
 IHesap hesap = uygulama.GetHesap();
 Console.WriteLine(String.Format("HesapTipi:{0} Bakiye:{1}",hesap.HesapTipi,hesap.Bakiye));

UI config ayarı da aşağıda gibi olmalıdır.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configSections>
 <section name="hesap_unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
 Microsoft.Practices.Unity.Configuration" />
 </configSections>
 <hesap_unity>
 <containers>
 <container>
 <type type="CommonLibrary.IHesapProvider, CommonLibrary"
 mapTo="DovizHesapLibrary.DovizHesapProvider, DovizHesapLibrary" />

 </container>
 </containers>
 </hesap_unity>

</configuration>

Eğer web.config de bir ayar hatası veya dll’lerde bir referansı unuttuğunuzda eğer unity block oluşturacağı dll leri veya sınıfları bulamazsa aşağıdaki hatayı almanız muhtemeldir.

“The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)”

Umarım faydalı olmuştur.

Reklamlar

Ekim 9, 2012 - Posted by | C#, Yazılım | , , , , ,

Henüz yorum yapılmamış.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s