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.

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

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s