有没有办法让依赖注入和扩展方法交互?
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;
}
我的 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;
}