Ho bisogno di accedere al mio database in una classe Singleton istanziata nella mia classe Startup. Sembra che iniettare direttamente risultati in un DbContext che è disposto.Utilizzare DbContext in ASP .Net Singleton Injected Class
ottengo il seguente errore:
Cannot access a disposed object. Object name: 'MyDbContext'.
La mia domanda è duplice: Perché non questo lavoro e come posso accedere al mio database in un'istanza di classe Singleton?
Ecco il mio metodo ConfigureServices nella mia classe di avvio:
public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity
services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
options =>
{
var config = Configuration["Data:DefaultConnection:ConnectionString"];
options.UseSqlServer(config);
});
// code removed for brevity
services.AddSingleton<FunClass>();
}
Qui è la mia classe controller:
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
Ecco il mio FunClass:
public class FunClass
{
private MyDbContext db;
public FunClass(MyDbContext ctx) {
db = ctx;
}
public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}
Vedere [questa risposta] (http://stackoverflow.com/questions/36246896/structuremap-creation-as-transient-per-request-not-working/36249145#36249145). Un oggetto non può avere dipendenze con una vita più breve di se stesso. È possibile iniettare una fabbrica per creare istanze più brevi o refactoring in modo che la radice del grafico dell'oggetto non sia un singleton. – NightOwl888
Sconsiglio vivamente di registrare il tuo 'DbContext' come Singleton, ci sono molti articoli sul web che ti dicono perché è una cattiva idea. Ecco una [risposta] (http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) fornita dal creatore di [Simple Injector] (https://simpleinjector.org/index) .html) che cerca di spiegare perché. Suggerisco vivamente di utilizzare un modello come i modelli * Repository * o * Unit of Work *. – QuantumHive
@QuantumHive grazie. Ho notato un avvertimento nella mia risposta di lavoro. – Tjaart