Ninject ile ASP .NET MVC’de Dependency Injection
Selamlar,
Bu makalede Ninject ile ASP.NET MVC’de Dependency Injection’ın nasıl uygulayabiliriz onun üzerine konuşuyor olacağız.
Dependency İnversion
Solid yazılım geliştirme prensiplerinden birisi olan ve “D” harfini temsil eden bu prensip bağımlılıkların tersine çevrilmesini anlamına gelmektedir.Biraz daha açıklayacak olursak nesneler ile çalışıyorsak mutlak nesne üretimi de yapıyoruz.Katmanlı mimari bir projede çalışırken katmanlar arası geçişlerde new anahtar kelimesi ile nesne üretimi yaptığımız anda artık o sınıfa bağımlı hale geliriz. Bunun yerine bu prensip bağımlılıkların dışarıdan enjekte edilmesini ve bu şekilde bağımlılıkların tersine çevrilmesini söyler.
Dependency İnjection
Dependency İnjection ise bu prensibin uygulanış yöntemidir. Bu yöntem ile bağımlılık oluşturabilecek nesnelerin dışarıdan enjekte edilmesi ve bağımlılıkların “loose coupled” yani gevşek bağlı bir şekilde yapılmasını sağlayan tasarım desenidir.
IoC Container
Inversion of Control (IoC)Nesnelerin uygulama boyunca ki yaşam döngüsünden sorumludur.Uygulama içerisinde
kullanılan nesnelerin instance’larının yönetimini sağlar.Nesne üretim işleminin Singleton olarak merkezi bir noktadan yönetimini sağlamaktadır.
- Castle Windsor
- Ninject
- StructureMap
- Autofac
- Unity
Katmanlı mimaride Ninject ile ASP.NET MVC’de Dependency Injection nasıl uygularız ona bakalım.
Nuget Package Manager Ninject Kurulumu

asp.net-mvc-dependency-injection-545×91
IRepository
1 2 3 4 | public interface IRepository<TEntity> where TEntity :class, new() { TEntity Add(TEntity entity); } |
RepositoryBase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class RepositoryBase<TEntity, TContext> : IRepository<TEntity> where TEntity : class, new() where TContext : DbContext, new() { public TEntity Add(TEntity entity) { using (var context = new TContext()) { var addedEntity = context.Entry(entity); addedEntity.State = EntityState.Added; context.SaveChanges(); return entity; } } } |
IStudentDal & StudentDal
1 2 3 4 5 6 7 8 | public interface IStudentDal:IRepository<Student> { } public class StudentDal:RepositoryBase<Student,EducationContext>, IStudentDal { } |
IStudentService & StudentManager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public interface IStudentService { Student Add(student Student); } public class StudentManager : IStudentService { private readonly IStudentDal _studentDal; public StudentManager(IStudentDal studentDal) { _studentDal = studentDal; } public Student Add(Student student) { return _studentDal.Add(student); } } |
NinjectBindModule.cs
1 2 3 4 5 6 7 8 | public class NinjectBindModule:NinjectModule { public override void Load() { Kernel.Bind<IStudentService>().To<StudentManager>().InSingletonScope(); Kernel.Bind<IStudentDal>().To<StudentDal>().InSingletonScope(); } } |
Kodumuza baktığımızda oluşturduğumuz sınıfımızı NinjectModule’den inherit ediyoruz. Daha sonra NinjectModule içerindeki Load metodunu
override edip soyut ve somut sınıflarımızı beliyoruz. Bu module ControllerFactory içersine register edeceğiz.
ControllerFactory.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class NinjectControllerFactory:DefaultControllerFactory { private IKernel _kernel; public NinjectControllerFactory() { _kernel=new StandardKernel(new NinjectBindModule()); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController) _kernel.Get(controllerType); } } |
Asp.Net Mvc yaşam döngüsüne baktığımızda bir controller’a request geldiği zaman DefaulControllerFactory devreye girerek o controller’dan bir nesne üretip içersindeki actionları invoke eder. Bunu yaparken parametresiz constructor’a sahip controller’lar üzerinde gerçekleştirir.Lakin bizim constructor’ımız parametre almakta ve şuan için DefaulControllerFactory bizim işimizi görmemektedir. Bunun için kendi ControllerFactory’mizi yazıyoruz.
Global.asax
1 2 3 4 5 6 | protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); } |
Son olarak Global.asax içinde Application_Start() metodunun içinde Controller’mızı Asp.Net Mvc yaşam döngüsüne ekliyoruz.
Katmanlı bir mimaride Ninject ile ASP .NET MVC’de Dependency Injection yöntemini kullanarak katmanlar arası bağımlılıkları en aza indirdik bir başka yazıda görüşmek üzere.
Hoşçakalın…
Son Yorumlar