Autofac ile ASP.NET Core’da Dependency Injection

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.

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: