Inject DbContext in Asp.Net Core. Concrete type or interface?

We're always injecting an interface, since it's easier to mock in unit and integration tests.

  1. Are you willing to change the signature of the MessageRepository constructor? It relies on the concrete type.
  2. Do you write tests for your code? Using and interface would make it easier to mock the database context.

If you've answered "no" to one or more of the above, inject the concrete type; otherwise, inject the interface.

[EDIT] use the following.

context services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>());

Currently working on a project myself, where I decided to go with 2 interfaces like this

public interface IDbContext : IDisposable
{
    DbContext Instance { get; }
}

and

public interface IApplicationDbContext : IDbContext
{
    DbSet<MyEntity> MyEntities { get; set; }
    ...
}

My concrete DbContext would then just implement the application context interface

public class ApplicationDbContext : DbContext, IApplicationDbContext
{
    public DbContext Instance => this

    public DbSet<MyEntity> MyEntities { get; set; }
}

This allows my implementation of the Application context to be injected as the application context interface, while also providing me access to the DbContext methods through the Instance property getter without having to add methods needed from the DbContext class to the interface.

Until now, this works great.