Web Api, Entity Framework ve Ninject Dependency Injection

Web Api, Entity Framework ve Ninject Dependency Injection

Merhabalar,
Hem kendim için hem de paylaşmak adına bu makale MVC & Web Api üzerinde Entity Code First ile Ninject entegrasyonunu anlatacağım.

Öncelikle boş bir MVC projesi açıyoruz ve hiç bir şey yapmadan “Package Manager Console”dan Ninject nugetını yüklüyoruz.

Install-Package Ninject.MVC5 

Kurulum tamamlandığında nuget bizim için “App_Start” klasörü altında ninject template’ini oluşturmuş oluyor zaten.

Entity Framework’ü Ninject üzerinden kullanmak için (ben genelde code first kullanıyorum, diğer model seçenekleri için geçerli midir bilemiyorum) Ninject’in Factory Extension paketini yine console managerdan yüklüyoruz.

Install-Package Ninject.Extensions.Factory

Web Api üzerinde Ninject’i kullanabilmemiz için aşağıda ki nuget’ı da yüklüyoruz.

Install-Package Ninject.Web.WebApi

Daha sonra Web Api üzerinden oluşturduğumuz servisleri ve interface’leri NinjectWebCommon.cs altında Register() metodunda enjekte ediyoruz.

Servisler için örn:

kernel.Bind<ICarService>().To<CarService>().InSingletonScope();

Aynı Register() metodumuz da yine Entity Framework Context’imizi enjekte ediyoruz.

Entity için örn:

kernel.Bind<Database>()
.ToMethod<Database>(context =>
{
    var dbContext = new Database();
    return dbContext;
})
.InRequestScope();

Burada dikkat çekmek istediğim bir konu var.
Servisleri enjekte ederken .InSingletonScope() olarak Entity’i enjekte ederken InRequestScope() olarak enjekte ettik.
InSingletonScope: Adından da tahmin edebileceğiniz üzere nesne örneği uygulama yaşamı boyunca sadece bir defa oluşturulur ve yapılan tüm taleplerde aynı nesne örneği paylaşılır. Transient kapsamından farklı olarak Singleton kapsamında nesnelerin dispose edilmesi Ninject çekirdeği tarafından takip edilmektedir. Bu sebeple Singleton kapsamı ile oluşturulmuş bir nesne Ninject çekirdeği ile birlikte dispose edilecektir.
InRequestScope: Web uygulamaları için kullanılabilen bu kapsam, her bir web isteği için nesnenin sadece bir defa oluşturulmaktadır. Web request’in sonlanması ile birlikte nesne Ninject çekirdeği tarafından dispose edilecektir.
InThreadScope: Bu kapsamda, talep edilen nesneler bağlı oldukları thread içerisinde bir defa oluşturularak bu thread’den gelen takip eden taleplerde aynı örnek paylaşılmaktadır. Singleton kapsamından farklı olarak Thread kapsamında nesnelerin tekilliği thread içerisindedir. Nesnenin yaşam ömrü talep edildiği thread ile sınırlıdır. Ninject çekirdeği ilgili thread’in sonlanması sırasında nesneyi dispose edecektir.

Servislerimiz ve Entity’nin kullanımında bir fark daha var. Constractor’da servislerimizi ve Entity’i aşağıdaki gibi Ninject’ten istemekteyiz.

Entity için Function üzerinden gitmek gerekiyor:

private readonly Func<Database> _dbFactory;

public CarService(Func<Database> dbFactory)
{
    _dbFactory = dbFactory;
}

Servisler için interface üzerinden gitmek gerekiyor:

private readonly ICarService _carService;

public CarController(ICarService carService)
{
    _carService = carService;
}

Umarım faydalı olmuştur.
Bol kodlu günler…

1,513 total views, 1 views today

No Comments

Leave a Comment

Ulaşım için: Facebook: /ganigani Twitter: @abdulgani_demir


*

%d blogcu bunu beğendi: