0

Можно ли использовать новый механизм впрыска зависимостей в ASP.NET Core для ввода IdentityDbContext в мой репозиторий?ASP.NET Core IdentityDbContext с использованием зависимости Инъекция

версия EF:

"EntityFramework.Commands": "7.0.0-rc1-final", 
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final", 

Контекст:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>,  IApplicationDbContext 
{ 
    public DbSet<Customer> Customers{ get; set; } 

    protected override void OnModelCreating(ModelBuilder builder) => base.OnModelCreating(builder); 
} 

Repository:

public class CustomerRepository: ICustomerRepository 
{ 
    private readonly IApplicationDbContext _context; 

    public CustomerRepository(IApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public List<Customer> GetAll() 
    { 
     return _context.Customers.ToList(); 
    } 
} 

Как настроить Startup.cs?

У меня есть базовая конфигурация

 services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

это не работает:

 services.AddTransient<IApplicationDbContext, ApplicationDbContext>(); 

ответ

0

Используя синтаксис services.AddTransient<IApplicationDbContext, ApplicationDbContext>(); спрашивает блок инъекции зависимостей непосредственно экземпляр ApplicationDbContext, который обходит созданную БД контекст завод EntityFramework.

Вместо этого, вы можете использовать этот синтаксис, который будет сохранять как ApplicationDbContext внутренне зарегистрирован AddDbContext:

services.AddTransient<IApplicationDbContext>(provider => provider.GetRequiredService<ApplicationDbContext>()); 
1

Вы действительно не нужно определить IApplicationDbContext для того, чтобы рамки инъекции зависимостей для работы.

Вы можете попробовать

Startup.cs:

services.AddDbContext<ApplicationDbContext>(options => 
    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

    // You can actually use 
    // Configuration.GetConnectionString("DefaultConnection") here instead to simplify the code 

Если вы посмотрите на второй параметр AddDbContext(), ServiceLifetime устанавливается в Scoped, что означает, что экземпляр объекта будет таким же в тот же запрос, но отличается от разных запросов.

Если вы хотите, чтобы каркас DI создавал разные экземпляры каждый раз, вы можете установить второй параметр на Transient.

Repository:

public class CustomerRepository: ICustomerRepository 
{ 
    private readonly ApplicationDbContext _context; 

    public CustomerRepository(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public List<Customer> GetAll() 
    { 
     return _context.Customers.ToList(); 
    } 
} 

Рамки DI вольет ApplicationDbContext автоматически.