如何将ILogger注入EFCore DbContext

问题描述 投票:0回答:3

我有带有 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));

如何注入

MyappDbContext
ILogger
ILoggerFactory
(创建记录器)?

c# dependency-injection entity-framework-core
3个回答
8
投票

您需要做的就是向上下文构造函数添加

ILoggerFactory
ILogger
参数:

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

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

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

但我建议使用 DI 代替:

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


0
投票

在 DbContextOptionsBuilder 方法的注释中。UseLoggerFactory 说:

使用其中之一时无需调用此方法 “AddDbContext”方法,包括“AddDbContextPool”。

MSDN 参考

© www.soinside.com 2019 - 2024. All rights reserved.