如何将ILogger注入EFCore DbContext

4
我有一个带有EFCore数据库上下文的.NET Core应用程序:
public class MyappDbContext : DbContext
{
    private ILogger<MyappDbContext> _logger;

    public MyappDbContext(DbContextOptions<MyappDbContext> options)
        : base(options)
    {
        // ???
    }
}

在启动类中,我注册了上下文:
services.AddDbContext<MyappDbContext>(options => options.UseSqlServer(connectionString));

如何注入到,或(用于创建日志记录器)?
2个回答

7

您所需做的只是在上下文构造函数中添加ILoggerFactoryILogger参数:

public class MyappDbContext : DbContext
{
    private readonly ILogger<MyappDbContext> _logger;

    public MyappDbContext(DbContextOptions<MyappDbContext> options,
        ILogger<MyappDbContext> logger)
        : base(options)
    {
        _logger = logger;
    }
}

3
你需要确保你也有一个空的构造函数,以便让EF数据库迁移正常工作。 - Joel Harkes
嗯,OP可能已经遇到了那个问题,所以这其实是一个不同的问题。 - DavidG
1
它工作得非常好。与此同时,我已经创建了IDbContextFactory。迁移使用IDbContextFactory来创建我的DbContext。 - massther
@DavidG 当然,我认为这是一个很好的提醒,因为这是在SO上最常见的错误和问题。 - Joel Harkes
@JoelHarkes 嗯,这远远不是第一大问题,我甚至会说它不在前1000名! - DavidG

1

如果需要手动实例化DbContext:

public class Startup
{
    public static readonly ILoggerFactory logFactory = LoggerFactory.Create(builder => builder.AddDebug());

    ....

    public Startup(IWebHostEnvironment env)
    {
        ....
    }
    public void ConfigureServices(IServiceCollection services)
    {
        ....
    }
}

public class MyDbContext : DbContext
{
    private readonly ILoggerFactory _loggerFactory;

    public MyDbContext(DbContextOptions<MyDbContext> options,
        ILoggerFactory loggerFactory)
        : base(options)
    {
        _loggerFactory = loggerFactory;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLoggerFactory(_loggerFactory);
        // optionsBuilder.EnableSensitiveDataLogging();
    }
}

// Somewhere else

var db = new MyDbContext(new DbContextOptions<MyDbContext>(), Startup.logFactory);

但我建议使用依赖注入:

public void ConfigureServices(IServiceCollection services)
{
            services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("Default")).UseLoggerFactory(logFactory));
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接