ASP.NET Core ile Autofac Önemi

Paylaş :

Autofac, ASP.NET Core'da yerleşik bir bağımlılık ekleme çerçevesinden nasıl daha esnek olabilir?

ASP.NET Core ile Autofac Önemi

Herkese Merhaba, Bugün sizlere Autofac IoC container'ını ASP.Net Core ile nasıl uygulayacağınızı anlatmayı planlıyorum. Bu durumda, tartışacağım,

  1. Autofac nedir?
  2. ASP.NET Core ile Autofac nasıl uygulanır?

Autofac nedir?

Autofac, .Net tabanlı bir IoC kapsayıcıdır. Sınıflar birbirleriyle etkileşime girdiğinde, boyut ve karmaşıklık olarak büyüdükçe uygulamaların esnek kalmasını sağlayan aralarındaki bağımlılıkları yönetir. Autofac, ASP.NET için en yaygın kullanılan DI/IoC kapsayıcıdır ve .NET Core ile de tamamen uyumludur.

.NET Core, kullanıma hazır yerleşik bir bağımlılık ekleme çerçevesine sahiptir. Varsayılan DI yeterli işlevsellik sağlasa da, onu kullanırken çeşitli sınırlamalar vardır. Autofac'ın çeşitli özellikleri vardır ve belirli durumlarda yerleşik bağımlılık enjeksiyon çerçevesinden daha esnektir, bu da onu iyi bir alternatif haline getirir.


ASP.NET Core ile Autofac nasıl uygulanır?

İlk olarak, Visual Studio kullanarak bir ASP.NET Core Web API projesi oluşturun. Burada göstermiyorum.

Şimdi aşağıdaki NuGet paketlerini kurmamız gerekiyor.

Autofac 
Autofac.Extensions.DependencyInjection

ASP.NET Core uygulamamızda Autofac as DI kapsayıcısını etkinleştirmek için program.cs dosyasını yapılandırın. Bu durumda, ekleyin 

UseServiceProviderFactory(new AutofacServiceProviderFactory()).


using Autofac.Extensions.DependencyInjection;

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Hosting;



namespace AutoFac_Test

{

    public class Program

    {

        public static void Main(string[] args)

        {

            CreateHostBuilder(args).Build().Run();

        }



        public static IHostBuilder CreateHostBuilder(string[] args) =>

            Host.CreateDefaultBuilder(args)

            .UseServiceProviderFactory(new AutofacServiceProviderFactory())

                .ConfigureWebHostDefaults(webBuilder =>

                {

                    webBuilder.UseStartup<Startup>();

                });

    }

}

Ardından, bu örnek için hizmetimizi oluşturmamız gerekiyor. Bu örnek için temel hizmeti oluşturuyorum. Bu durumda, kök dizinde bir Hizmetler klasörü oluşturuyorum. Ardından Services klasöründe aşağıdaki kod gibi IEmployeeService arayüzünü oluşturuyorum.

Ardından yukarıdaki IEmployeeService Arayüzünü uygulamamız gerekiyor. Bu durumda Services içinde EmployeeService sınıfını oluşturuyorum ve GetEmployeeNames() yöntemini aşağıdaki kod gibi uyguluyorum.


using System.Collections.Generic;



namespace AutoFac_Test.Services

{

    public interface IEmployeeService

    {

        List<string> GetEmployeeNames();

    }

}

Böylece artık hizmetimizi yaratmış oluyoruz. Şimdi Autofac kullanarak hizmetlerimizi kaydetmemiz gerekiyor. Bu durumda aşağıdaki kod gibi Startup sınıfında ConfigureServices metodundan sonra ConfigureContainer metodunu eklememiz gerekiyor . Autofac kullanarak hizmetleri kaydetmenin iki yolu vardır.

Doğrudan hizmet kaydı ekleyin

Bu yaklaşım, küçük bir uygulama ile birkaç hizmet kullandığımızda iyidir. Çünkü birkaç servisi kaydetmemiz gerekiyor ve sorun değil. Bu durumda hizmetlerimizi direkt olarak aşağıdaki kodla ekleyebiliriz.


using Autofac;

using AutoFac_Test.Configurations;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;

using Microsoft.OpenApi.Models;



namespace AutoFac_Test

{

    public class Startup

    {

        //--other code configuration

        

        //This method will call the after ConfigureServices Method.

        public void ConfigureContainer(ContainerBuilder builder)

        {

            builder.RegisterType<EmployeeService>().As<IEmployeeService>().InstancePerDependency();

        }



        //-- other code configuration

    }

}

Modül kaydı olarak hizmetleri ekleyin

Bir çok hizmeti kaydetmemiz gerektiğinde, Bu yaklaşım gerçekten çok iyi. Çünkü hizmetlerimizi kaydetmek için ayrı modül sınıfları kullanıyoruz ve ayrıca başlangıç sınıfı kodunu temiz kod olarak tutabiliyoruz.

Bu durumda, bir modül sınıfı oluşturmamız gerekir. Öncelikle kök dizinde Configuration klasörünü oluşturuyorum ve ardından aşağıdaki kod gibi Autofac'ta Modülü devralan RegisterModule adlı modül sınıfını oluşturuyorum. Daha sonra RegisterModule içerisine servislerimizi aşağıdaki kod gibi kayıt etmemiz gerekiyor.

Ayrıca, DI kapsayıcısını kullanarak hizmetleri kaydederken üç tür yaşam süresi vardır. Geçici, Kapsamlı ve Singleton'dur. Bu ömürleri Autofac'ı aşağıdaki kod gibi kullanarak da kullanabiliriz.


using Autofac;

using AutoFac_Test.Services;



namespace AutoFac_Test.Configurations

{

    public class RegisterModule : Module

    {

        protected override void Load(ContainerBuilder builder)

        {

            builder.RegisterType<EmployeeService>().As<IEmployeeService>();



            // Other Lifetime

            // Transient

            //builder.RegisterType<EmployeeService>().As<IEmployeeService>()

            //    .InstancePerDependency();



            //// Scoped

            builder.RegisterType<EmployeeService>().As<IEmployeeService>()

                .InstancePerLifetimeScope();





            //// Singleton

            //builder.RegisterType<EmployeeService>().As<IEmployeeService>()

            //    .SingleInstance();



        }

    }

}

Daha sonra modül kaydı için modülümüzü ConfigureContainer metoduna aşağıdaki kod gibi eklememiz gerekiyor.


using Autofac;

using AutoFac_Test.Configurations;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;

using Microsoft.OpenApi.Models;



namespace AutoFac_Test

{

    public class Startup

    {

        //--other code configuration

        

        //This method will call the after ConfigureServices Method.

        public void ConfigureContainer(ContainerBuilder builder)

        {

            builder.RegisterModule(new RegisterModule());

        }



        //-- other code configuration

    }

}

6. Ardından, controller'a bağımlılığı enjekte etmemiz gerekiyor. Bu durumda Controllers klasöründeki EmployeeController'ı aşağıdaki kod gibi oluşturuyorum. Yapıcıyı kullanarak bağımlılığı enjekte ediyoruz ve hizmet uygulamamızı denetleyiciyle aşağıdaki kod gibi kullanıyoruz.


using AutoFac_Test.Services;

using Microsoft.AspNetCore.Mvc;



namespace AutoFac_Test.Controllers

{

    [ApiController]

    [Route("[controller]")]

    public class EmployeeController : Controller

    {

        private readonly IEmployeeService _employeeService;

        public EmployeeController(IEmployeeService employeeService)

        {

            _employeeService = employeeService;

        }



        [HttpGet]

        public IActionResult GetEmployeeNames()

        {

            var employeeNames = _employeeService.GetEmployeeNames();



            return Ok(employeeNames);

        }

    }

}

Şimdi uygulamayı çalıştırmamız gerekiyor ve ardından Employee Get endpoint. Bu nedenle, umarım tüm uygulamalarınız başarılı bir şekilde çalışır. Ayrıca, kodu buradan alabilirsiniz .

Özet

.NET Core, karmaşıklığın bir kısmını ortadan kaldırırken hızlı ve kolay bir şekilde kullanılabilen yerleşik bir bağımlılık ekleme çerçevesi içerir. Varsayılan DI'nin yeterli işlevsellik sağlamasına rağmen, bazı durumlarda ek kodlama vardır. Tüm bunları küçük projelerde haklı çıkarmak mümkün. Büyük ölçekli projelerde çalışırken, Autofac'ın kapsamlı yeteneğine sahip olmak oldukça faydalı olabilir ve hatta vazgeçilmez hale gelebilir.

Bugünlük bu kadar. Umarım yazımdan yeni bir şeyler öğrenmişsinizdir.

Yakında başka bir yazıda görüşmek üzere !!

Hesabınızı yönetmek için giriş yapın

veya