Mig*_*ura 6 entity-framework-core asp.net-core
在Asp.Net Core项目中,我正在注入Entity Framework DbContext:
public MessageRepository(MyDbContext context) {
}
Run Code Online (Sandbox Code Playgroud)
且配置为:
services
  .AddEntityFramework()
  .AddSqlServer()
  .AddDbContext<Context>(x => x.UseSqlServer(connectionString);
Run Code Online (Sandbox Code Playgroud)
我应该创建一个接口IMyDbContext并注入它吗?
public class MyDbContext : DbContext, IMyDbContext { }
public MessageRepository(IMyDbContext context) {
}
Run Code Online (Sandbox Code Playgroud)
在所有ASP.NET Core示例中,我都看到了具体类型MyDbContext的注入,而不是接口。
我应该选择什么选项?
目前我自己在做一个项目,在那里我决定使用 2 个这样的接口
public interface IDbContext : IDisposable
{
    DbContext Instance { get; }
}
Run Code Online (Sandbox Code Playgroud)
和
public interface IApplicationDbContext : IDbContext
{
    DbSet<MyEntity> MyEntities { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)
我的具体 DbContext 然后将只实现应用程序上下文接口
public class ApplicationDbContext : DbContext, IApplicationDbContext
{
    public DbContext Instance => this
    public DbSet<MyEntity> MyEntities { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这允许我将应用程序上下文的实现作为应用程序上下文接口注入,同时还允许我通过 Instance 属性 getter 访问 DbContext 方法,而无需将 DbContext 类所需的方法添加到接口。
到目前为止,这很好用。
我们总是注入一个接口,因为在单元和集成测试中更容易模拟。
MessageRepository构造函数的签名吗?它依赖于具体类型。如果您对上述一项或多项回答“否”,请注入具体类型;否则,注入接口。
[编辑] 使用以下内容。
context services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>());
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3307 次  |  
        
|   最近记录:  |