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>();
}