Dependency Injection Nedir

Dependency Injection Nedir?

Hepimizin bildiği gibi Contructor dediğimiz method her sınıfın türetildiği ve default olarak boş tanımlanan bir methoddur. Yani kısacası, Nesne yönelimli programlamada bir nesneyi türetmek için kullanılan ve o nesnenin daha sonra alt methodlarına / fonksiyonlarına erişmek için kullanılan methoddur.

Ancak elbette burada önemli husus, bu nesne yaratılırken zaten kullanıyor olduğumuz bu method bir de alt sınıflar bağlayarak aynı anda, yani o method içerisinde işimiz bitene kadar onlarında türetilmiş olmasını sağlayabiliriz. Yani aslına bakarsanız amiyane tabir ile “bir taşla iki kuş vurmuş ve performanstan da çok şey kaybetmemiş oluruz”​​ 

Ancak .Net içerisinde default olarak bu işlemi yapabilmemiz mümkün değildir. İşte bu nedenle Dependency Injection “Bağımlılık Enjeksiyonu”’na​​ ​​ ihtiyaç duymaktayız. Bunu yaparken de elbette yapıda bir miktar değişikliğe yol açabilmek için bazı DLL’leri nugget üzerinden import etmemiz icap etmekte.

Burada belirtmek gerekir ki, bu işlemi .Net içerisinde birden fazla yöntemle yapmanız mümkün. Ben bu yazıda Microsoft’un DLL’leri ile bu işlemleri gerçekleştirmeyi anlatıyor olacağım.

 

Öncelikle projemize aşağıdaki DLL’leri referans olarak ekliyoruz;

  • Microsoft.Practices.ServiceLocation

  • Microsoft.Practices.Unity

  • Microsoft.Practices.Unity.Configuration

  • Microsoft.Practices.Unity.Mvc

  • Microsoft.Practices.Unity.RegistrationByConvention

  • Microsoft.Web.Infrastructure

Eğer MVC projemizin App_Start klasörü altında yok ise, “UnityMvcActivator” ve “UnityConfig” oluşturuyoruz. (Tabii aslında olacaktır.)

İçerileri aşağıdaki şekilde olmalıdır;

 

UnityMvcActivator.cs:

using​​ Microsoft.Practices.Unity.Mvc;

using​​ System;

using​​ System.Collections.Generic;

using​​ System.Linq;

using​​ System.Web;

using​​ System.Web.Mvc;

 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(UnityWebActivator),​​ "Start")]

[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(UnityWebActivator),​​ "Shutdown")]

 

namespace​​ YourNamespace.Web.App_Start

{

 ​​ ​​ ​​​​ public​​ static​​ class​​ UnityWebActivator

 ​​ ​​ ​​​​ {

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ public​​ static​​ void​​ Start()

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var​​ container = UnityConfig.GetConfiguredContainer();

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ FilterProviders.Providers.Add(new​​ UnityFilterAttributeFilterProvider(container));

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ DependencyResolver.SetResolver(new​​ UnityDependencyResolver(container));

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ public​​ static​​ void​​ Shutdown()

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var​​ container = UnityConfig.GetConfiguredContainer();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ container.Dispose();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​​​ }

}

 

UnityConfig.cs:

using​​ Microsoft.Practices.Unity;

using​​ System;

using​​ System.Collections.Generic;

using​​ System.Linq;

using​​ System.Web;

 

namespace​​ Biggflex3.Web.App_Start

{

 ​​ ​​ ​​​​ public​​ class​​ UnityConfig

 ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ #region​​ Unity Container

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ private​​ static​​ readonly​​ Lazy<IUnityContainer> Container =​​ new​​ Lazy<IUnityContainer>(() =>

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var​​ container =​​ new​​ UnityContainer();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ RegisterTypes(container);

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ return​​ container;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ });

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ ///​​ <summary>

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ ///​​ Gets the configured Unity container.

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ ///​​ </summary>

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ public​​ static​​ IUnityContainer GetConfiguredContainer()

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ return​​ Container.Value;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ #endregion

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ public​​ static​​ void​​ RegisterTypes(IUnityContainer container)

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ container

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ .RegisterType<IRepository<Customer>, Repository<Customer>>(new​​ PerRequestLifetimeManager())

 

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ .RegisterType<ICustomerService, CustomerService>(new​​ PerRequestLifetimeManager())

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​​​ }

}

Share this Story

Related Posts

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir

Search