簡體   English   中英

以 static 方式引用非靜態方法

[英]Referencing non-static method in a static way

我有這個 C# class:

public static class HealthCheckHighMark
{

    public static IEndpointConventionBuilder MapHighMarkChecks(
        this IEndpointRouteBuilder endpoints)
    {

        return endpoints.MapHealthChecks("/api/health/highmark", new HealthCheckOptions
        {
            ResponseWriter = async (context, report) =>
            {
                var result = JsonConvert.SerializeObject(
                    new HighMarkResult
                    {
                        HighMark = HHandler.GetHighMark().High.ToString(),
                    }, Formatting.None,
                    new JsonSerializerSettings
                    {
                        NullValueHandling = NullValueHandling.Ignore
                    });
                context.Response.ContentType = MediaTypeNames.Application.Json;
                await context.Response.WriteAsync(result);
            },

            Predicate = (check) => check.Tags.Contains("highmark")
        });
    }
}

HHandler.GetHighMark()HHandler class 中的非靜態方法:

public WatermarkOffsets GetHighMark()
{
    return consumer.QueryWatermarkOffsets(TopicPartition.TopicPartition, TimeSpan.FromSeconds(2));
}

當我運行檢查時,我收到HTTP 500錯誤,日志中出現以下錯誤:

2021-03-03 11:54:51.308Z 錯誤 APP=2227 COMP=3789 [13] 連接 ID“0HM6U7CJEMU0S”,請求 ID“0HM6U7CJEMU0S:00000001”:應用程序引發了未處理的異常。 - Logger=Microsoft.AspNetCore.Server.Kestrel,Level=ERROR,ThreadId=13,,Exception="System.MissingMethodException: 找不到方法:'Confluent.Kafka.WatermarkOffsets Ed.Md.FHandler.Health.HHandler.GetHighMark() '. 在 Ed.Health.HealthCheckHMark.<>c.<<-cctor>b__2_0>d.MoveNext() 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine) 在 Ed.Health.HealthCheckHMark。< >c.<.cctor>b__2_0(HttpContext context, HealthReport report) at Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.InvokeAsync(HttpContext httpContext) at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger 記錄器)在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 應用程序)“

我認為問題在於我試圖以 static 方式引用非靜態方法。 我該如何解決這個問題?

附加信息

這是我的HHandler class:

public class HHandler : IHHandler
{
    private readonly IConfig _config;
    public IConsumer<Ignore, MdpMessage> consumer { get;  set; }
    public TopicPartitionOffset TopicPartition { get; set; }

    public HHandler([NotNull] IConfig healthOptions)
    {
        _config = healthOptions;
    }

    public WatermarkOffsets GetHighMark()
    {
        return consumer.QueryWatermarkOffsets(TopicPartition.TopicPartition, TimeSpan.FromSeconds(2));
    }

    WatermarkOffsets IHHandler.GetHighMark()
    {
        return GetHighMark();
    }
}

您要在此運行狀況檢查端點中檢查什么?

它通常用於檢查某些現有系統是否健康,例如內部數據庫連接正常,或者某些資源低於限制等。因此,您需要對該現有系統進行檢查 - 如果它不是靜態 class,則應該是某個地方的一個實例,singleton 也許,或者以某種方式創建該實例(例如某個工廠),如果它是瞬態的。 通常一個好主意是讓 DI 容器為您解析實例。 當然,前提是您使用的是 DI(嗯,在現代 AspNetCore 中,我認為您應該使用它:)

嘗試類似的東西

context.RequestServices.GetService(typeof(HHandler)).GetHighMark().High.ToString()

看看這是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM