Autofac ile ASP.NET Core’da Dependency Injection

Özge Odabaş
3 min readDec 14, 2023

Autofac, .NET uygulamalarında kullanılan güçlü bir Inversion of Control (IoC) containerıdır ve .NET Core’un kendi varsayılan IoC containerından farklı olarak bir dizi avantaj sunar. Autofac, özellikle gelişmiş özelleştirme seçenekleri; Singleton, Scoped, Transient gibi yaygın kullanılan yaşam döngülerinin yanı sıra, özelleştirilebilir yaşam döngüsü yönetimi sunması; AOP (Aspect Oriented Programming) prensiplerini uygulamayı kolaylaştırması; modüler yapılar gibi özellikleri ile öne çıkar. Autofac’i kullanmak, uygulamanın genişleyebilirliğini ve bakımını kolaylaştırabilir.

Dependency Injection hakkında bilgi edinmek için şu yazımı okuyabilirsiniz:

https://medium.com/@ozgeeodabassg/dependency-injection-di-net-f7c848203f2c

1. Autofac’i Projeye Ekleme

PM> Install-Package Autofac
PM> Install-Package Autofac.Extras.DynamicProxy

Genellikle business katmanı olmak üzere, autofac modulünü yazacağınız katmana (projeye) NuGet Package Manager Console’dan yukarıdaki komutlar ile ekleyebilir veya direkt olarak NuGet Package Managerdan yükleyebilirsiniz.

Not: DynamicProxy paketini AOP kullanacaksanız yükleyebilirsiniz.

NuGet Package Manager’dan Yükleme

2. Autofac Modülünü Oluşturma

UserManager, ProductManager ve CategoryManager servislerimiz olduğunu varsayalım. Örneğin User entitysi için;

    public interface IUserService
{
List<User> GetAll();
void Delete(int id);
void Add(User user);
//others
}
}
    public class UserManager : IUserService
{
private IUserDal _userDal;

public UserManager(IUserDal userDal)
{
_userDal = userDal;
}

public void Add(User user)
{
_userDal.Add(user);
}

public void Delete(int id)
{
_userDal.Delete(id);
}

public List<User> GetAll()
{
return _userDal.GetAll();
}

//other methods
}

Servis kayıtlarını yapmamızı sağlayacak modülü oluşturmamız gerekiyor.

public class AutofacBusinessModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//singleton lifetimes
builder.RegisterType<UserManager>().As<IUserService>().SingleInstance();
builder.RegisterType<ProductManager>().As<IProductService>().SingleInstance();
builder.RegisterType<CategoryManager>().As<ICategoryService>().SingleInstance();
//more ioc service regiters
}
}

3. Program.cs Konfigürasyonu

Servis kayıtlarını yapacağımız Program.cs dosyasında uygulamaya klasik .NET IoC container’la gerçekleştirdiğimiz kayıtlar yerine Autofac modulü ile gerçekleşeceğiniz belirtmemiz gerekiyor.

Bunun için örneğin bir WebApi katmanına Autofac’in Dependency Injection paketini ekliyoruz.

PM> Install-Package Autofac.Extensions.DependencyInjection

Artık normal IoC kayıtlarımızı Autofac’e çevirmeye hazırız.

//old IoC registers
//builder.Services.AddSingleton<IUserService, UserManager>();
//builder.Services.AddSingleton<IProductService, ProductManager>();
//builder.Services.AddSingleton<ICategoryService, CategoryManager>();


//Autofac Configuration
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder=>
{
builder.RegisterModule(new AutofacBusinessModule());
});

Bu noktadan sonra artık Controller sınıflarımızda dependency injection’ı yine olduğu gibi kullanmaya devam edebiliriz.

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private IUserService _service;

public UsersController(IUserService service)
{
_service = service;
}

[HttpGet("getall")]
public IActionResult GetAll()
{
return _service.GetAll();
}

//other requests like add, delete, update

Autofac’in proje içinde nasıl kullanıldığını incelemek için geliştirmekte olduğum ASP.NET Core projesini aşağıdaki repodan inceleyebilirsiniz:

Beni takip etmek isterseniz:

https://www.linkedin.com/in/ozgeodabas/

--

--

Özge Odabaş

Merhaba! Ben Özge. Junior Java Developerım. Kendimi geliştirirken edindiğim bilgileri yazıyorum. Keyifli okumalar.