Home Configurando o container de DI no .NET Core +
Post
Cancelar

Configurando o container de DI no .NET Core +

Aqui vai um exemplo simples e rápido de como colocar o container de injeção de dependências do .NET em uma aplicação console nas versões do .NET 5+

.NET Core 3.x + testado na versão core 3.1, dotnet 5 e dotnet 6.

Configurando o container em uma web app .net

A maneira mais comum e facil é instanciar os seus objetos de serviços nas web apps, que ja vem nas classes Startup do .NET Core e na Program do NET 5 e NET 6.

.NET CORE 2+ - Classe Startup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // Esse método é chamado durante o tempo de execução. Use-o para adicionar servições ao container de DI.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddLogging();
        services.AddMongoDB(Configuration);
        services.AddScoped<ICategoryRepository, CategoryRepository>();
        services.AddSingleton<IActivityRepository, ActivityRepository>();
        services.AddTransient<CustomMongoSeeder>();

    }
    ...
}

.NET 5 e 6 - Classe Program

Lembrando que as classes Program do NET 5 e 6, com a atualização do .NET, eles oferecem algo chamado top level statment, que eu realmente não sei o que é de fato ainda mas percebe-se que utilizando essa marcação, a classe Program vem sem o static void Main(string[] args){} mas o funcionamento é o mesmo aparentemente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var builder = WebApplication.CreateBuilder(args);
...
#region [DI]

builder.Services.AddSingleton(typeof(IMongoRepository<>), typeof(MongoRepository<>));
builder.Services.AddSingleton<NewsService>();
builder.Services.AddScoped(typeof(IAlgumRepository<>), typeof(AlgumRepository<>));
builder.Services.AddSingleton<IActivityRepository, ActivityRepository>();
builder.Services.AddTransient<CustomMongoSeeder>();

#endregion
...
app.Run();

Com a classe padrao fica facil instanciar os containeres, só utilizar o objeto builder, acessar o objeto Services e adicionar seguindo os 3 modelos, Singleton,Scoped e Transient.

Configurando o ambiente no Console Application

Já com o console, fica um pouco diferente, pq vc não tem a classe construida ao criar o esqueleto do projeto, dai vc tem que criar na mão. E fica algo mais ou menos assim:

Dentro da classe Program do esqueleto montado com o dotnet new via CLI ou criar novo projeto pelo VS 2019 ou 2022.

1
2
3
4
5
6
7
8
9
10
11
12
13
//Adicionando o service collection
var serviceCollection = new ServiceCollection();
//configurar o serviço
serviceCollection.AddSingleton<DIContainer>();
serviceCollection.AddScoped<DIContainer>();
serviceCollection.AddTransient<DIContainer>();

//Criar o serviço e adiciona-lo ao container
var serviceProvider = serviceCollection.BuildServiceProvider();

//Caso queira verificar o serviço gerado
var service1 = serviceProvider.CreateScope().ServiceProvider.GetRequiredService<DIContainer>();

Aqui você já tem os serviços dentro do container prontos para usalos no console, agora basta chama-los.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Console application
public static void Main(string[] args)
{
    //Adicionando o service collection
var serviceCollection = new ServiceCollection();
//configurar o serviço
serviceCollection.AddSingleton<DIContainer>();

//Criar o serviço e adiciona-lo ao container
var serviceProvider = serviceCollection.BuildServiceProvider();

//Caso queira verificar o serviço gerado
var service1 = serviceProvider
.CreateScope()
.ServiceProvider
.GetRequiredService<DIContainer>();

// Aqui você já está usando os metodos do serviço dentro do container
service1.NomeDoMetodo();

}

Bom, é isso, cada um seguindo o escopo de criação para Singleton, Scoped e Transient.

vlw flw 💪😎

Esta postagem está licenciada sob CC BY 4.0 pelo autor.

Setting-up Blog

Deploy ASP .NET no Linux [WSL]