ASP.Net 核心 2.2 - 方法重载出现在 Visual Studio 但在 运行 时不起作用

ASP.Net Core 2.2 - Method overload appears in Visual Studio but does not work at run-time

我正在尝试验证用户是否已通过自定义策略获得授权。我按照 Ode To Code 上的教程将此功能添加到我的控制器中。在 Visual Studio 中,代码似乎是正确的并且使用了已知的重载。

请注意,它说重载是 "extension"。直到我今天花了 5 个小时试图解决以下错误,我才注意到这一点:

如您所见,我尝试使用的过载似乎没有被使用。我在这里做错了什么吗?我需要做些什么来包含这些扩展方法吗?我已尝试清理和重建解决方案,但这并没有解决问题。

虽然您已经为 IAuthorizationSerivce 定义了字段,但您没有提供任何设置方法。您需要为 LRController 定义一个构造函数,它采用单个参数 IAuthorizationService,并将其分配给字段。

我认为教程中有该构造函数的定义。

请注意名称更改:例如 IAuthorizationService _authorization 的全局变量名称已添加了下划线前缀。显然不是必需的,但作为 thumb/good 编码标准 IMO 的一个很好的规则。 :-)

public class LRController : Controller
{
    private readonly IAuthorizationService _authorization;

    // you're missing this constructor & this pattern is known as Constructor Dependency Injection
    public LRController(IAuthorizationService authorization)
    {
        _authorization = authorization;
    }

    public async Task<RedirectToActionResult> Index()
    {
        var superAdmin = await _authorization.AuthorizeAsync(User, "IsLucky");
        //rest of your code here
    }

}

编辑

此外,如果您 wanted/needed 将其他接口注入该控制器,您需要将其添加到该 LRController 构造函数中。看起来像这样:

public class LRController : Controller
{

    private readonly IAuthorizationService _authorization;
    private readonly IOtherService _otherService;

    public LRController(IAuthorizationService authorization, IOtherService otherService)
    {
        _authorization = authorization;
        _otherService = otherService;
    }

    public async Task<RedirectToActionResult> Index()
    {
        var superAdmin = await _authorization.AuthorizeAsync(User, "IsLucky");
    }

    public async Task Foo()
    {
        await _otherService.Bar();
    }

}