将 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 into
options
,但第一个DI需要将上下文注入 provider,但第一个DI需要将 options 注入 context*,但首先 DI 需要注入 provider into
options
...
@CaiusJard,我明白你的意思。但是这个问题有什么解决办法呢?
【参考方案1】:
使用 LoggingContext 的人应该创建一个新实例,可能在构造函数或基类构造函数中。
【讨论】:
让我澄清一下,DatabaseLoggerProvider
将上下文实例传递给DatabaseLogger
。然后在DatabaseLogger
的Log
方法中使用它。我也不能注入它。以上是关于将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception的主要内容,如果未能解决你的问题,请参考以下文章
将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception