将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception

Posted

技术标签:

【中文标题】将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception【英文标题】:Injecting DbContext into LoggerProvider throws ***Exception in .NET Core 【发布时间】:2020-02-18 12:30:14 【问题描述】:

我正在使用 .net core 2.2 和 entityframework 核心。我想使用实体框架在数据库中写入日志。所以我试图将 DbContext 注入 LoggerProvider。

//主函数

new WebHostBuilder().ConfigureLogging((hostingContext, logging) =>

    logging.ClearProviders();                                        
    logging.AddDatabase(hostingContext.Configuration);
).UseStartup<Startup>();

//扩展方法

public static ILoggingBuilder AddDatabase(this ILoggingBuilder builder, IConfiguration configuration)

    builder.AddConfiguration();
    builder.Services.AddDbContext<LoggingContext>(options => options.UseSqlServer(configuration.GetConnectionString("DevelopmentConnection"), x => x.MigrationsHistoryTable("__LoggingMigrationHistory", "dbo")));
    builder.Services.TryAddEnumerable(ServiceDescriptor.Scoped<ILoggerProvider, DatabaseLoggerProvider>());
    builder.Services.TryAddEnumerable(ServiceDescriptor.Scoped<IConfigureOptions<LoggerOptions>, LoggerConfigurationOptions>());
    builder.Services.TryAddEnumerable(ServiceDescriptor.Scoped<IOptionsChangeTokenSource<LoggerOptions>, LoggerProviderOptionsChangeTokenSource<LoggerOptions, DatabaseLoggerProvider>>());
    return builder;

//记录器选项

public class LoggerOptions

    public string LogLevel  get; set;      

//LoggerConfigurationOptions

public class LoggerConfigurationOptions : ConfigureFromConfigurationOptions<LoggerOptions>

    public LoggerConfigurationOptions(ILoggerProviderConfiguration<DatabaseLoggerProvider> providerConfiguration) : base(providerConfiguration.Configuration)
    
    

//记录上下文

public class LoggingContext : DbContext

    public LoggingContext(DbContextOptions<LoggingContext> options) : base(options) //In base constructor exception is thrown
    
    

//记录器提供者

[Microsoft.Extensions.Logging.ProviderAlias("Database")]
public class DatabaseLoggerProvider : ILoggerProvider

    public DatabaseLoggerProvider(IOptionsMonitor<LoggerOptions> Settings, LoggingContext context) //I cannot inject context here
    
    

问题是 DbContext 构造函数抛出 ***Exception。谁能告诉我哪里做错了?

【问题讨论】:

所以你将 context 注入 provider,但首先 DI 需要将 options 注入 上下文,但第一个DI需要注入provider intooptions,但第一个DI需要将上下文注入 provider,但第一个DI需要将 options 注入 context*,但首先 DI 需要注入 provider into options... @CaiusJard,我明白你的意思。但是这个问题有什么解决办法呢? 【参考方案1】:

使用 LoggingContext 的人应该创建一个新实例,可能在构造函数或基类构造函数中。

【讨论】:

让我澄清一下,DatabaseLoggerProvider 将上下文实例传递给DatabaseLogger。然后在DatabaseLoggerLog方法中使用它。我也不能注入它。

以上是关于将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception的主要内容,如果未能解决你的问题,请参考以下文章

将 DbContext 与依赖注入一起使用

将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception

通过依赖注入实现后台任务的 DbContext

dbcontext是注入还是传递好

通过 Azure 函数注入 DbContext 时无法访问已处置的对象

ASP.NET Core DbContext 注入