【问题标题】:ASP.NET Core IdentityDbContext using dependency InjectionASP.NET Core IdentityDbContext 使用依赖注入
【发布时间】:2016-09-27 12:40:04
【问题描述】:

是否可以在 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();
    }
}

如何配置 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>();

【问题讨论】:

    标签: c# entity-framework dependency-injection asp.net-core asp.net-identity


    【解决方案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

    存储库

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

    DI 框架会自动为您注入ApplicationDbContext

    【讨论】:

      【解决方案2】:

      使用services.AddTransient&lt;IApplicationDbContext, ApplicationDbContext&gt;(); 语法要求依赖注入块直接实例化ApplicationDbContext,从而绕过EntityFramework 设置的DB 上下文工厂。

      相反,您可以使用这种语法,这将保留ApplicationDbContext 在内部由AddDbContext 注册的方式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        相关资源
        最近更新 更多