在 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 设置的数据库上下文工厂。
相反,您可以使用此语法,这将保留ApplicationDbContext
由AddDbContext
内部注册的方式:
services.AddTransient<IApplicationDbContext>(provider => provider.GetRequiredService<ApplicationDbContext>());