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.

Source: https://autofaccn.readthedocs.io/en/latest/integration/mvc.html, https://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

22 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

  6. Murat dedi ki:

    Çok güzel anlatım teşekkürler.

  7. Cihan dedi ki:

    Teşekkürler güzel faydalı bir makale olmuş.

  8. Ahmet dedi ki:

    Teşekkürler faydalı bir makale.
    Interface kullanmak zorunlu mu? Sadece Classlar ile register yapabilir miyiz?

    • borsoft dedi ki:

      Teşekkürler Ahmet,
      Evet Interface, Autofac ve bildiğim tüm Dependency Injection araçlarda zorunlu.

      İyi çalışmalar.

  9. Başar dedi ki:

    Bora hocam teşekkürler. Ancak anlamadığım birşey var. Burada Index.cshtml içinde Product class üyesini model olarak kullanıyorsunuz. Yeni bir IProduct sınıfı ile çalışacak olursak, bu sefer Index ‘deki modelin tipini değiştirmemiz gerekecek. Model olarak IProduct kullanabileceğimiz bir yöntem mevcut mu?

    • borsoft dedi ki:

      Selamlar Başar,

      Bir Interface tabi ki bir model olarak kullanılamaz. Ama Beklenen Model: “class product where T :IProduct” şeklinde tanımlanabilir.

      İyi çalışmalar.

  10. Emrullah Keles dedi ki:

    Merhaba,
    Autofac ile signalr I kullanınca sistemi yavaşlatıyor.
    Signalr kullanan servisimin Classini ve interface ini registertype Ile birbirine bağladıktan sonra instanceperdepency i kullanıyorum ama rami sisiriyor ve sitenin yavaşlamasına sebep oluyor.sanirim connectioni kapatamadigi icin yavaslatiyor.her db islemlerinden sonra connection close yapmak istemiyirum.metodlarimi ado sorgularinada cevirmek istemiyirum.instancelifescope u denedim sorunu cozuyor ama baska hata veriyor. Bunun önüne gecebilmek için instanceperdepency den başka ne kullanabilirim.
    Teşekkürler.

  11. Yunus dedi ki:

    Teşekkürler

  12. Yunus dedi ki:

    https://my.pcloud.com/publink/show?code=XZBWwK7ZoA8YQUw6so0UCOLxbQoeqQdedTO7

    Projeyi yazmaya üşenenler için linki kullanabilirsiniz =) Saygılar

  13. cem dedi ki:

    Mümemmel anlatım,teşekkürler hocam.Hocam mvc.core için olanı yok mu?
    Birde mvc core da stratup a yazılan örn: services.AddSingleton(); den farkı ne bu kullanımdaki container ın.
    Saygılarımla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.