ASP.NET Core DbContext injection
AddDbContext
implementation just registers the context itself and its common dependencies in DI.
Instead of AddDbContext
call, it's perfectly legal to manually register your DbContext:
services.AddTransient<FooContext>();
Moreover, you could use a factory method to pass parameters (this is answering the question):
services.AddTransient<FooContext>(provider =>
{
//resolve another classes from DI
var anyOtherClass = provider.GetService<AnyOtherClass>();
//pass any parameters
return new FooContext(foo, bar);
});
P.S., In general, you don't have to register DbContextOptionsFactory
and default DbContextOptions
to resolve DbContext itself, but it could be necessary in specific cases.
You can use this in startup.cs.
Detail information : https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
Detail Example : Getting started with ASP.NET Core MVC and Entity Framework Core
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>options.
UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
In order to register DbContext
as a service in IServiceCollection
you have two options:(we assume that you are going to connect to a SQL Server database)
Using AddDbContext<>
services.AddDbContext<YourDbContext>(o=>o.UseSqlServer(Your Connection String));
Using AddDbContextPool<>
services.AddDbContextPool<YourDbContext>(o=>o.UseSqlServer(Your Connection String));
as you might see these two are in terms of writing have similarities, but in fact they have some fundamental differences in terms of concepts. @GabrielLuci has a nice response about the differences between these two: https://stackoverflow.com/a/48444206/1666800
Also note that you can store your connection string inside the appsettings.json file and simply read it using: Configuration.GetConnectionString("DefaultConnection")
inside the ConfigureServices
method in Startup.cs
file.