La mia app utilizza un modello singleton per un'istanza di classe del gestore. È responsabile della gestione di alcuni eventi:
public class MyHandler
{
public void HandlerEvent(object sender, EventArgs e)
{
//want to update DB here
}
}
Probabilmente MyHandler dovrà iniziare l'interazione con DB. Quindi posso farlo? C'è la mia visione:
DbContext
come singleton a MyHandler
. Ovviamente è una cattiva idea. DbContext
a MyHandler
, ma come istanza "una per richiesta". Penso che nel mio caso ( MyHandler
sia singleton) questo è simile a 1 using
operatore, ad esempio come transazione atomica, per esempio using(var context = new XDbContext()) {...}
Per me è un buon approccio, ma DbContext dell'implementazione Entity Framework Core ha bisogno di DbContextOptions
come argomento del suo costruttore . Se dichesto il costruttore senza parametri per XDbContext, genera un'eccezione. Qualche idea?
Ho visto un tutorial di ef core ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext ) e come ho capito, DbContextOptions
- è solo un oggetto con i parametri di configurazione al suo interno. Se avessi lo stesso problema, userei il terzo modo (con l'uso), ma creerei un helper per l'iniezione di parametri o l'utilizzo di una fabbrica per questo. Ho trovato un esempio di fabbrica nel tutorial
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
namespace MyProject
{
public class BloggingContextFactory : IDbContextFactory<BloggingContext>
{
public BloggingContext Create()
{
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Filename=./blog.db");
return new BloggingContext(optionsBuilder.Options);
}
}
}
Esempio di utilizzo:
public class MyHandler
{
public void HandlerEvent(object sender, EventArgs e)
{
// Or make 'Create' method static
using(var context = new BloggingContextFactory().Create())
{
. . .
}
}
}