Sto cercando di caricare alcune delle viste dal database come descritto qui . Quindi voglio usare EF Core nel provider di file.
RazorViewEngineOptions
ha una proprietà FileProviders
che puoi aggiungere al tuo fornitore di file. Il problema è che devi dargli un'istanza del fornitore di file. Quindi dovrai istanziare tutte le dipendenze dei fornitori di file proprio lì nel metodo ConfigureServices
di Startup.
Attualmente IServiceProvider
un'istanza di IServiceProvider
nel metodo Configure
di avvio. Quindi memorizzo l'istanza in un campo (chiamato _serviceProvider
):
IServiceProvider _serviceProvider;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider provider)
{
_serviceProvider = provider;
...
}
Quindi in ConfigureServices
uso questo campo per instanciare UIDbContext
.
services.Configure<RazorViewEngineOptions>(options =>
{
var fileProvider = new DbFileProvider(_serviceProvider.GetService<UIDbContext>());
options.FileProviders.Add(fileProvider);
});
C'è un modo migliore per essere in grado di iniettare UIDbContext
nel costruttore DbFileProvider
o in qualsiasi modo per istanziare un UIDbContext
all'interno di DbFileProvider
senza IServiceProvider
?
Non si desidera utilizzare DbContext
come origine del provider di file come si è fatto.
DbContext
non è thread-safe , quindi non funzionerà quando si ha una singola istanza di DbContext
per l'intero provider, poiché più richieste potrebbero chiamare DbContext
e la sua operazione più di una volta contemporaneamente, risultando in eccezione quando si tenta di eseguire 2 query in parallelo.
Dovresti istanziare una connessione (come nell'articolo collegato) o l' DbContext
per IFileInfo
/ IDirectoryContents
.
DbContextOptions<UIDbContext> should be registered as singleton, so you can resolve it once
all'interno di Configure` senza problemi e passarlo al tuo provider.
In alternativa puoi anche chiamare DbContextOptionsBuilder
e creare / costruire un DbContextOptions<T>
, ma poi devi ripetere la configurazione per te fatto all'interno di AddDbContext
(es .UseSqlServer()
).
Tuttavia può essere utile in quanto consente di impostare diverse impostazioni (ad esempio, cambiando il modo in cui vengono registrati gli errori, ecc.).