Autofac ile ASP .NET MVC’de Dependency Injection

Selamlar,

Bugün Autofac üzerine örnekler yaparak Dependency Injection konusuna değineceğiz. Aslında Autofac en kaba tabiri ile .Net framework için geliştirilmiş olan bir IOC container’dır.

Peki IOC Container nedir? Oluşturulacak olan nesnelerin yaşam döngüsünün yönetilmesidir. Yani belirlenen koşullarda, herbir request için singelton(Tekil) şekilde ilgili nesne örneğinin bizim adımıza üretilmesidir. Bu bize kolaylık ve kodda gözle görülür bir sadelik getirir.

Boş bir Mvc proje yaratılıp, Nuget’den aşağıdaki paketler indirilerek, “Autofac” projeye dahil edilmiş olunur.

Model klasörü altına “Product” sınıfımızı oluşturalım:

Product.cs:

Repository” adında bir klasör açalım. İçerisine aşağıdaki “IProduct” interfaceini ve bu interfaceden türeyen “ProductRepo” adlı sınıf aşağıdaki gibi oluşturalım.

Iproduct.cs: 

ProductRepo.cs: Aşağıda size örnek olması amacı ile, ürünler ile ilgili CRUD işlemlerin yapılabileceği bir Repository oluşturulmuştur.

Şimdi örnek olması amacı ile bir Mail Validate Servisi oluşturalım:

IMailService: 

MailService: Aşağıdaki MailService’inde “CheckMail()” methodu girilen email’in geçerli olup olmadığını “EmailAddressAttribute().IsValid()” ile kontrol etmektedir.

3. ve Son bir servis örneği olarak aşağıda  girilen isimin ve soy ismin değiştirilerek, ismin baş harfinin büyük, soy ismin tamamının büyük olması sağlanmıştır.

IService.cs:

Service.cs: Girilen ismin büyük harfle başlayıp, soyadın tamamının büyük harf ile yazılması sağlanmıştır.

Bugün 2 farklı yol ile ilgili servisleri “Register” edeceğiz. Öncelikle gelin uzun yol ile aşağıdaki gibi ilgili servisleri register edelim.

Global.asax:

  • var builder = new ContainerBuilder(): Autofac için, yeni bir container oluşturulur.
  • builder.RegisterControllers(Assembly.GetExecutingAssembly()) :İlgili “builder” Controller’ların Constructer’ında Injection yapılabilmesi için “builder” Container register edilir.
  • builder.RegisterType<Register_Edilecek_Sınıf>.As<Türetilen_Interface> İlgili tüm servisler bu şekilde Register edilir.

Dependency Injection İle Kullanım:

Ekran çıktısı:

HomeController.cs: Aşağıda görüldüğü gibi tüm ilgili servisler “HomeController“‘ın constructer’ında çağrılmıştır.  Ve Dependency Injection ile, ilgili Constructer içerisinde istenen servis Singleton olarak getirilmiştir. “Index()” methodunda “MailService()‘”inde girilen ilgili mail’in geçerli olup olunmadığına bakılır. “_Service”‘de ise girilen ismin büyük harf ile başlayıp soyadın tamamının büyük olması sağlanır. Son olarak “_ProductService” ile ilgili product ürünler listelenir. Böylece “HomeController” sınıfı içinde ilgili 3 servis yaratılmamış “Autofac” sayesinde singleton bir şekilde sisteme Constructer’da dahil edilmesi sağlanmıştır.

Index.cshtml: İlgili ürünlerin, mailin ve ismin gösterildiği ekran aşağıdaki gibidir. Çalıştırılan servislerin resultları bu ekrandan görülmektedir.

Böylece Autofac ile Dependency Injection kavramına bir giriş yapmış olduk. Mvc projemizin loose coupling bir yapıda yani, geliştirmeye açık ama değiştirmiye kapalı bir hale gelmesi sağlanmıştır. Ayrıca ilgili servisler tekrar tekrar yaratılması yerine tek bir seferde “Application_Start()” methodunda singleton olarak oluşturulması sağlanmıştır. Bu da bize hem işlem maliyetinden kurtulmamıza, hem de daha sade bir kod elde etmemize olanak sağlamıştır.

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

9 Cevaplar

  1. Kerim Karaman dedi ki:

    Eline sağlık Bora..

  2. Yazınız için teşekkürler. Fakat ikinci yolu unuttunuz sanki :)
    “Bugün 2 farklı yol ile ilgili servisleri ‘Register’ edeceğiz.”

  3. yusuf çağraoğlu dedi ki:

    “Öncelikle gelin uzun yol ile aşağıdaki gibi ilgili servisleri register edelim” dedin abi kısa yolu da bekliyoruz , emeğine sağlık , hayırlı işler

    • borsoft dedi ki:

      Selam Yusuf,
      Öncelikle Teşekkürler.
      2. Yol artık başka bir makalenin içinde geçicek. 2.yok farklı bir yapı ile yeni bir uygulama yazılarak yapılması gerektiğinden sanırım bu makaleyi daha fazla uzatmak istemedim.

      İyi çalışmalar.

  4. ekrem dedi ki:

    Merhaba hocam makale için teşekkürler.

    Dediğiniz gibi uyguladım çalıştı ancak static classlarda constroctur methodu kullanmadan interfaceleri nasıl çağıracağımı bulamadım. Bu konu hakkında fikriniz varsa paylaşabilir misiniz?

  5. Hakan dedi ki:

    Hocam proje büyüdükçe Application_Start() içerisinde çok uzun bir kod blogu olmasını engellemek için nasıl bir yapı kurabiliriz.Örneğin tek bir Interface den kalıtım alan sınıfların hepsini tek seferde resgister edebilir miyiz

    • borsoft dedi ki:

      Selam Hakan,

      Benim bildiğim yok. O malesef büyüyor. Ama performance anlamında bir sorun olmaz. Yalnız istersen tahminimce partial sınıflar oluşturup bölümlendirebilirsin. Böylece sayfaları guruplara göre ayırmış olursun. Denemedim. Ama denemesi bedava :)

      İyi akşamlar…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir