Sobes.tech
Junior — Middle

Kaip vykdoma kelių vienu metu vykstančių užklausų apdorojimas Scoped vieno proceso kontekste?

sobes.tech AI

Atsakymas iš AI

Vienoje procesų aplinkoje su Scoped priklausomybėmis ASP.NET Core, kiekvienas HTTP užklausas gauna savo atskirą Scoped paslaugų egzempliorių. Kai keli užklausos vykdomos vienu metu tame pačiame procese, kiekvienai užklausai sukuriamas atskiras Scoped konteineris, izoliuotas nuo kitų.

Tai pasiekiama naudojant DI konteinerio mechanizmą, kuris sukuria naują scope pradžioje ir sunaikina jį pabaigoje. Taip, net ir vieno proceso programoje, kiekvienas užklausas dirba su savo Scoped paslaugų rinkiniu, kas užkerta kelią duomenų konfliktams tarp užklausų.

Maždaug taip:

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

// Kiekvieno užklausos apdorojimo metu sukuriamas naujas scope
app.Use(async (context, next) => {
    using (var scope = app.ApplicationServices.CreateScope())
    {
        var myService = scope.ServiceProvider.GetRequiredService<IMyService>();
        // myService naudojimas užklausos metu
        await next();
    }
});

Iš tikrųjų, ASP.NET Core automatiškai sukuria scope kiekvienai HTTP užklausai, todėl programuotojui dažniausiai nereikia jo rankiniu būdu kurti.