Configurando Injeção de Dependência com Autofac no ASP.NET Core

Passo 1: Adicionar os Pacotes NuGet

No gerenciador de pacotes NuGet, pesquise por "Autofac" e instale as duas bibliotecas necessárias: a biblioteca principal do Autofac e a biblioteca de integração para inversão de controle.

Passo 2: Registrar os Serviços

Modifique o método ConfigureServices na classe Startup para integrar o Autofac.

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    // 1. Criar uma instância do construtor de contêiner
    var builder = new ContainerBuilder();
    // 2. Incorporar os serviços padrão do sistema
    builder.Populate(services);
    // 3. Registrar serviços por tipo
    builder.RegisterType<UserRepository>().As<IUserRepository>().SingleInstance();
    // 4. Construir o contêiner
    var container = builder.Build();
    // 5. Retornar o provedor de serviços
    return new AutofacServiceProvider(container);
}

Passo 3: Utilizar a Injeção

Para consumir os serviços, utilize a injeção via construtor em um controlador ou outra classe.

public class UserController : Controller
{
    private readonly IUserRepository _userRepository;

    // Injeção de dependência no construtor
    public UserController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public IActionResult Details()
    {
        var result = _userRepository.GetDetails();
        return Content($"Dados obtidos: {result}");
    }
}

Extensão: Regsitro por Módulo

Além do registro por tipo, o Autofac suporta organização via módulos. Crie uma classe que herde de Autofac.Module.

public class RepositoryModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<UserRepository>().As<IUserRepository>().SingleInstance();
        // Registrar outros tipos aqui...
    }
}

Em seguida, atualize o método de configuração para utilizar o módulo.

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    var builder = new ContainerBuilder();
    builder.Populate(services);
    // Registrar via módulo em vez de tipo individual
    builder.RegisterModule<RepositoryModule>();
    var container = builder.Build();
    return new AutofacServiceProvider(container);
}

Tags: Autofac ASP.NET Core Injeção de Dependência C# NuGet

Publicado em 6-1 13:09 por Thomas