Как внедрить зависимости внутри проверки работоспособности ядра ASP.NET - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь использовать новую функцию ASP.NET Code 2.2 Healthchecks .

В этой ссылке в блоге .net показан пример:

public void ConfigureServices(IServiceCollection services)
{
    //...
    services
        .AddHealthChecks()
        .AddCheck(new SqlConnectionHealthCheck("MyDatabase", Configuration["ConnectionStrings:DefaultConnection"]));
    //...
}

public void Configure(IApplicationBuilder app)
{
    app.UseHealthChecks("/healthz");
}

Я могу добавить пользовательские проверки, которые реализуют интерфейс Microsoft.Extensions.Diagnostics.HealthChecks.IHealthCheck.Но так как мне нужно предоставить методу AddCheck экземпляр вместо типа, и он должен работать внутри метода ConfigureServices, я не могу внедрить какую-либо зависимость в свой пользовательский контролер.

IsЕсть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

В дополнение к ответу Шона: существует открытый запрос на получение доступа , который позволит внедрить службы с любым сроком службы (временные и ограниченные) в проверки работоспособности.Скорее всего, это произойдет в версии 2.2.

Когда вы можете использовать временные службы и службы с определенными областями в проверках здоровья, вы должны зарегистрировать их, используя временный образ жизни .

0 голосов
/ 26 августа 2018

Короткий ответ

Как внедрить зависимости внутри проверки работоспособности ядра ASP.NET.

Если мы зарегистрируем наши службы в правильном порядке, тогда SomeDependency будет доступен для инъекции в конструктор SomeHealthCheck, а SomeHealthCheck будет работать как часть функции проверки работоспособности.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks();
    services.AddSingleton<SomeDependency>();

    // register the custom health check 
    // after AddHealthChecks and after SomeDependency 
    services.AddSingleton<IHealthCheck, SomeHealthCheck>();
}

Подробнее

A комментарий в примерах Health Check гласит:

Все услуги IHealthCheck будут доступны для службы проверки работоспособности и промежуточного программного обеспечения. Мы рекомендуем регистрировать все проверки здоровья как услуги Singleton.

Полный образец

using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;

public class SomeDependency
{
    public string GetMessage() => "Hello from SomeDependency";
}

public class SomeHealthCheck : IHealthCheck
{
    public string Name => nameof(SomeHealthCheck);

    private readonly SomeDependency someDependency;

    public SomeHealthCheck(SomeDependency someDependency)
    {
        this.someDependency = someDependency;
    }

    public Task<HealthCheckResult> CheckHealthAsync(
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var message = this.someDependency.GetMessage();
        var result = new HealthCheckResult(HealthCheckStatus.Failed, null, null, null);
        return Task.FromResult(result);
    }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHealthChecks();
        services.AddSingleton<SomeDependency>();
        services.AddSingleton<IHealthCheck, SomeHealthCheck>();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseHealthChecks("/healthz");
        app.Run(async (context) => await context.Response.WriteAsync("Hello World!"));
    }
}

Этот образец также доступен на GitHub здесь .

...