ASP.NET Core IdentityDbContext using dependency Injection


是否可以

在 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);
}

存储 库:

 public class CustomerRepository: ICustomerRepository
{
    private readonly IApplicationDbContext _context;
    public CustomerRepository(IApplicationDbContext context)
    {
        _context = context;
    }
    public List<Customer> GetAll()
    {
        return _context.Customers.ToList();
    }
}

如何配置启动.cs?

我有基本配置

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

这不起作用:

        services.AddTransient<IApplicationDbContext, ApplicationDbContext>();

你真的不需要定义IApplicationDbContext就可以让依赖注入框架工作。

你可以试试

启动.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

存储库

public class CustomerRepository: ICustomerRepository
{
    private readonly ApplicationDbContext _context;
    public CustomerRepository(ApplicationDbContext context)
    {
        _context = context;
    }
    public List<Customer> GetAll()
    {
        return _context.Customers.ToList();
    }
}

DI 框架将自动为您注入ApplicationDbContext

使用 services.AddTransient<IApplicationDbContext, ApplicationDbContext>(); 语法要求依赖注入块直接实例化 ApplicationDbContext ,这绕过了 EntityFramework 设置的数据库上下文工厂。

相反,您可以使用此语法,这将保留ApplicationDbContextAddDbContext内部注册的方式:

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

相关内容

  • 没有找到相关文章

最新更新