Проверьте сеанс перед запуском проблемы с контроллером в ядре ASP. NET - PullRequest
1 голос
/ 08 июля 2020

Итак, я хочу проверить, существует ли сеанс, прежде чем запускать какое-либо действие в контроллере. Я нашел эти решения link1 , link2 и попытался реализовать их. Это мой класс SessionAuthorize, здесь все вроде нормально:

public class SessionAuthorize : ActionFilterAttribute
{
    private readonly SessionManager _sessionManager;
    public SessionAuthorize(SessionManager sessionManager)
    {
        _sessionManager = sessionManager;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        if (!_sessionManager.IsLoggedIn)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                            { "Controller", "Home" },
                            { "Action", "Login" }
                            });
        }
    }
}

Теперь проблема возникает, когда я пытаюсь вызвать его в контроллере. Поэтому я должен позвонить, добавив атрибут [SessionAuthorize] следующим образом:

[SessionAuthorize]
public class AccountController : Controller
{
    //code
}

Но это дает мне ошибку, которую я не вызываю должным образом. Я считаю, что это связано с инъекцией зависимостей, которую я использовал в SessionAuthorize для доступа к сеансу. Но я не уверен, как это вызвать сейчас.

Сообщение об ошибке:

'Не указан аргумент, который соответствует требуемому формальному параметру' sessionManager 'из' SessionAuthorize .SessionAuthorize (SessionManager) '

Итак, я хотел бы знать, как я должен использовать его в своем контроллере

1 Ответ

2 голосов
/ 08 июля 2020

Если вы хотите избежать шаблона Service Locator, вы можете использовать DI путем внедрения конструктора с TypeFilter.

В вашем контроллере попробуйте использовать

[TypeFilter(typeof(SessionAuthorize)]

И ваш ActionFilterAttribute больше не требуется доступ к экземпляру поставщика услуг.

...