Skip to main content

Introdução | Ambiente .NET

  • Introdução | Ambiente .NET

Hierarquia das interfaces principais | WebApplicationBuilder, IConfiguration, IWebHostEnvironment

  • Hierarquia das interfaces principais | WebApplicationBuilder, IConfiguration, IWebHostEnvironment

Versão Moderna

Program.cs

├── WebApplication.CreateBuilder(args)
│ │
│ └── Cria o WebApplicationBuilder
│ ├── IConfiguration (builder.Configuration)
│ ├── IWebHostEnvironment (builder.Environment) ou IHostEnvironment (Worker)
│ ├── IServiceCollection (builder.Services)
│ ├── ILoggingBuilder (builder.Logging)
│ └── IHostBuilder (builder.Host)

├── [Configuração de serviços e middlewares]
│ └── Executado dentro de Program.cs
│ ex: builder.Services.AddControllers();
│ builder.Services.Configure<AppSettings>(...);

└── builder.Build() ← Aqui nasce o IServiceProvider real

├── IServiceProvider (app.Services)
│ ├── IOptions<T> (disponível a partir daqui)
│ └── Demais serviços resolvíveis via DI

├── IApplicationBuilder (interno ao WebApplication)
│ └── Monta o pipeline HTTP (UseRouting, UseEndpoints etc.)

└── IWebHost (Kestrel + ciclo de vida da aplicação)

└── KestrelServer (escuta e processa requisições)

Versão Clássica

Program.cs

└── Host.CreateDefaultBuilder(args)

├── Configura infraestrutura (IConfiguration, Environment, Logging)
└── Usa Startup.cs

├── Startup.ConfigureServices(IServiceCollection services)
│ │
│ ├── IConfiguration já disponível (via construtor)
│ ├── IServiceCollection disponível
│ └── IServiceProvider ainda NÃO criado

├── Criação do IServiceProvider
│ └── O container é montado internamente após ConfigureServices()

└── Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider sp)

├── IServiceProvider DISPONÍVEL aqui
├── IOptions<T> DISPONÍVEL aqui
├── Montagem do pipeline HTTP (app.UseRouting, etc.)
└── IWebHost / KestrelServer iniciam após app.Run()

Hierarquia de construção do ASP .NET Core


# Forma tradicional

CreateHostBuilder(args)

HostBuilder

ConfigureAppConfiguration(...)

ConfigureServices(...)

Build()

IServiceProvider

Configure(...) ← pipeline HTTP

Run()

Host / Servidor (Kestrel)

-----------------------------------------------------------------------

# Minimal Hosting

CreateBuilder()

WebApplicationBuilder

IConfiguration
IWebHostEnvironment
IServiceCollection ← equivalente ao ConfigureServices

builder.Services.Add(...)

Build()

IServiceProvider
IApplicationBuilder

app.Use(...)
app.Map(...)

Run()

Host / Servidor (Kestrel)


Dicas | GetRequiredService | Injeção de Dependência

success

Enquanto estamos na parte do ConfigureServices, o IServiceProvider não está disponível. Então para podermos obter algum serviço temporário podemos utilizar o código abaixo. MAS CUIDADO, EM CICLOS DE VIDA SINGLETON, ELE CRIA UMA INSTÂNCIA PARA CADA CHAMADA

//services = IServiceCollection
using var temProvider = services.BuildServiceProvider();

//injeção que precisavamos
var settings = temProvider.GetRequiredService<IOptions<BaseFeatureFlag>>().Value;

Nas novas versões do .NET, dependendo do local você pode usar o código abaixo:

using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var myDependency = services.GetRequiredService<IMyDependency>();
}