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())
}
}
}
Kimler Neler Demiş?