首页 > 解决方案 > 在 ConfigureServices 中访问 IOptions 和 DbContext

问题描述

我已经开始在我的 .NET Core Web API 中实施健康检查。有两种健康检查,一种用于检查 SQL Server 是否有任何挂起的迁移,另一种用于检查另一个 API 是否处于活动状态。两者都ConfigureServicesStartup课堂上添加。

为了进行迁移检查,我需要访问DbContext已经添加到 DIAddDbContext的使用并检查 API,我需要从配置中获取 API 基本 url,使用services.Configure<>. 我使用以下代码来访问DbContext.

我正在使用AspNetCore.HealthChecks.Uris包来使用AddUrlGroup健康检查。

var sp = services.BuildServiceProvider();
var dbContext = sp.GetService<AppDbContext>();
var apis = sp.GetService<IOptions<InternalServicesConfiguration>>().Value;

services.AddHealthChecks().AddCheck("Database", new SqlDatabaseHealthCheck(dbContext), tags: new[] { "ready" })
            .AddUrlGroup(new Uri(new Uri(apis.Api1BaseUri), "/health/live"), HttpMethod.Get, "API 1", HealthStatus.UnHealthy, new []{"ready"});

services.BuildServiceProvider()显示以下警告:

从应用程序代码调用“BuildServiceProvider”会导致创建单例服务的附加副本。考虑替代方案,例如依赖注入服务作为“配置”的参数

我可以使用获取 api 基本网址

_configuration.GetSection("InternalServicesConfiguration").Get(typeof(InternalServicesConfiguration));

但我想不出另一种访问DbContext.

非常感谢任何帮助。

标签: c#asp.net-core

解决方案


您可以像这样注册您的健康检查:

services.AddHealthChecks()
    .AddCheck<ExampleHealthCheck>("Database");

然后只需将您注入DbContextExampleHealthCheck必须实现IHealthCheck接口的类中


推荐阅读