Sobes.tech
Junior — Middle

Como é que o processamento de várias solicitações que ocorrem simultaneamente é realizado no contexto Scoped de um único processo?

sobes.tech IA

Resposta da IA

Num contexto de processo único com âmbito Scoped para dependências no ASP.NET Core, cada pedido HTTP recebe a sua própria instância de serviços com âmbito Scoped. Quando vários pedidos são processados simultaneamente no mesmo processo, é criado um contêiner Scoped separado para cada pedido, isolado dos outros.

Isto é conseguido através do mecanismo do contêiner DI, que cria um novo escopo no início do pedido e o destrói ao terminar. Assim, mesmo numa aplicação de processo único, cada pedido trabalha com o seu próprio conjunto de serviços Scoped, o que previne conflitos de dados entre pedidos.

Mais ou menos assim:

// No Startup.cs
services.AddScoped<IMyService, MyService>();

// Ao processar cada pedido, é criado um novo escopo
app.Use(async (context, next) => {
    using (var scope = app.ApplicationServices.CreateScope())
    {
        var myService = scope.ServiceProvider.GetRequiredService<IMyService>();
        // Uso de myService no âmbito do pedido
        await next();
    }
});

Na realidade, o ASP.NET Core cria automaticamente um escopo para cada pedido HTTP, pelo que normalmente o programador não precisa de o criar manualmente.