ASP.Net Core 2.2 - перегрузка метода появляется в Visual Studio, но не работает во время выполнения - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь проверить, авторизован ли пользователь с помощью пользовательской политики. Я следовал руководству по Ode To Code , чтобы добавить эту функцию в мой контроллер. В Visual Studio код выглядит корректным и использует известную перегрузку.

Visual Studio Screen Capture

Обратите внимание, что это говорит о том, что перегрузка является "расширением". Я не обращал на это особого внимания, пока сегодня не провел 5 часов, пытаясь решить следующую ошибку:

Asp.net error

Как видите, может показаться, что перегрузка, которую я пытаюсь использовать, не используется. Я что-то здесь не так делаю? Что-то особенное, что я должен сделать, чтобы включить эти расширенные методы? Я попытался очистить и восстановить решение, но это не решило проблему.

Ответы [ 2 ]

4 голосов
/ 09 июля 2019

Хотя вы определили поле для IAuthorizationSerivce, вы не указали способ его установки. Вам необходимо определить конструктор для LRController, который принимает один параметр IAuthorizationService, и назначить его полю.

Я думаю, что в этом руководстве было определение этого конструктора.

3 голосов
/ 09 июля 2019

Обратите внимание на изменение имени: например, имя глобальной переменной для IAuthorizationService _authorization имеет префикс с подчеркиванием.Очевидно, не требуется, но, как хорошее практическое правило / хороший стандарт кодирования, 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
    }

}

РЕДАКТИРОВАТЬ

Кроме того, если вы хотите / должны добавить другие интерфейсы в этот контроллер, вы бы добавили его в конструктор 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();
    }

}
...