有没有办法让依赖注入和扩展方法交互?

Is there a way to have Dependency Injection and an Extension method interact?

我的 NuGet 包库中有一个如下所示的方法:

public async Task<string> GetLogoutUrl(HttpContext httpContext, string encodedUserJwt, string relativeRedirectUrl)
{
    var redirectUrl = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}/{relativeRedirectUrl}";
    var logoutUrlParameters = $"id_token_hint={encodedUserJwt}&post_logout_redirect_uri={redirectUrl}";
    var logoutUrl = $"{await DiscoveryDocument.GetLogoutEndpoint()}?{logoutUrlParameters}";
    return logoutUrl;
}

我真的很想让它成为 HttpContext 的扩展方法,这样我的 NuGet 用户就可以这样调用它:HttpContext.GetLogoutUrl(encodedUserJwt, "Home");

但问题在于此方法使用 DiscoveryDocument 注入到此方法当前所在的 class 中。我一直在想办法获得扩展方法的良好语法,但仍然能够从依赖注入中获得 DiscoveryDocument,同时又不会破坏太多我晚上无法入睡的最佳实践.

在 C# 中有没有办法拥有扩展方法并仍然连接到依赖项注入对象?

注意:我不想让使用我的 NuGet 的开发人员必须传入 DiscoveryDocument 的实例。对于我的 NuGet 架构,这比 GetLogoutUrl 不是扩展方法更糟糕。

服务定位器通过

IServiceProvider HttpContext.RequestServices { get }

必须使用,因为这是一个静态调用,它通常不适合 DI,因为它通常以实例为中心。

潜在的扩展方法最终看起来像这样

public static async Task<string> GetLogoutUrl(this HttpContext httpContext, 
    string encodedUserJwt, string relativeRedirectUrl) {
    var redirectUrl = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}/{relativeRedirectUrl}";
    var logoutUrlParameters = $"id_token_hint={encodedUserJwt}&post_logout_redirect_uri={redirectUrl}";

    var DiscoveryDocument = httpContext.RequestServices
        .GetRequiredService<DiscoveryDocumentTypeHere>();

    var logoutUrl = $"{await DiscoveryDocument.GetLogoutEndpoint()}?{logoutUrlParameters}";
    return logoutUrl;
}