【发布时间】:2021-03-27 11:57:40
【问题描述】:
我的 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,它被注入到这个方法当前所在的类中。我一直在想一种方法,我可以获得扩展方法的良好语法,但仍然能够从依赖注入中获得DiscoveryDocument,同时又不会破坏那么多我晚上睡不着的最佳实践。
在 C# 中有没有办法拥有扩展方法并仍然连接到依赖注入对象?
注意:我不想让使用我的 NuGet 的开发人员必须传入 DiscoveryDocument 的实例。对于我的 NuGet 架构来说,这比仅仅让 GetLogoutUrl 不是扩展方法更糟糕。
【问题讨论】:
-
扩展方法 -> 静态类 -> 无 DI :)
-
为什么不需要它作为参数?
DiscoveryDocument实际上是该方法的输入,即使它是隐式的this.。这是一个依赖。 -
@madreflection - 虽然是公开的,但它比我希望我的用户必须与之交互的层次更深。正如我所说,最好将它保留在它所在的班级中。(它所在的班级处于“中等”级别,而
DiscoveryDocument处于“低”级别。)
标签: c# asp.net-core dependency-injection extension-methods