I need to access my database in a Singleton class instantiated in my Startup class. It seems that injecting it directly results in a DbContext that is disposed.
I get the following error:
Cannot access a disposed object. Object name: 'MyDbContext'.
My question is twofold: Why doesn't this work and how can I access my database in a singleton class instance?
Here is my ConfigureServices method in my Startup class:
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>();
}
Here is my controller class:
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
Here is my 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;
}
}
DbContext
as a Singleton, there are many articles on the web that tell you why it's a bad idea. Here is an answer provided by the creator of Simple Injector that tries to explain why. I would strongly suggest to use a pattern like the Repository or Unit of Work patterns. – Tsar