Sto implementando la funzione azzurrata attivata dalla coda - sto usando una libreria di modelli di mediatori chiamata Mediatr per migliorare la segregazione delle query di comando - e usando l'ultima iniezione di dipendenza del costruttore runtime (2.0.12382.0) nella funzione di Azure in base al seguente tutorial https: //devkimchi.com/2019/02/22/performing-constructor-injections-on-azure-functions-v2/
Per ogni trigger di funzione di Azure, chiamo MediaH CommandHandler
ma sto ricevendo un errore:
"Una seconda operazione è stata avviata in questo contesto prima del completamento di una precedente operazione. Questo di solito è causato da thread diversi che utilizzano la stessa istanza di DbContext, tuttavia i membri dell'istanza non sono garantiti come thread-safe. Ciò potrebbe anche essere causato da una query nidificata valutata sul client, in tal caso riscrivere la query evitando invocazioni nidificate. "
L'errore indica che sto tentando di accedere alla stessa istanza di DbContext
da attività parallele. tuttavia ho solo un gestore di comandi (Mediatr Handler) e un gestore di query. e sto usando l'iniezione del costruttore per questo
Ho provato a modificare il servizio Meditr in modo che sia transitorio all'avvio, ma ricevo comunque lo stesso errore durante il test della funzione all'interno dell'emulatore della funzione azzurro
Classe di avvio
public class StartUp : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var connection = configuration.GetConnectionString("Default");
builder.Services.AddDbContext<CoreDBContext>(options =>
{
options.UseSqlServer(connection, p =>
{
p.MigrationsAssembly("B12Core.Persistence");
});
}
);
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPreProcessorBehavior<,>));
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPerformanceBehaviour<,>));
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestValidationBehavior<,>));
builder.Services.AddMediatR(p =>
{
p.AsTransient();
}, typeof(CreateMessageCommand).GetTypeInfo().Assembly);
}
}
Errore completo
System.Private.CoreLib: eccezione durante l'esecuzione della funzione: Funzione1. Microsoft.EntityFrameworkCore: una seconda operazione è stata avviata in questo contesto prima del completamento di un'operazione precedente. Questo di solito è causato da thread diversi che utilizzano la stessa istanza di DbContext, tuttavia i membri dell'istanza non sono garantiti come thread-safe. Ciò potrebbe anche essere causato da una query nidificata valutata sul client, in tal caso riscrivere la query evitando invocazioni nidificate.
Risolto modificando la durata dell'iniezione del contesto db in ServiceLifetime.Transient
builder.Services.AddDbContext<CoreDBContext>(options =>
{
options.UseSqlServer(connection, p =>
{
p.MigrationsAssembly("Presistence");
});
},ServiceLifetime.Transient
);