Не удалось избежать исключения NullReferenceException в Action Filter (ASP.NET Ядро)

#asp.net-core #action-filter

#asp.net-ядро #действие-фильтр

Вопрос:

Я пишу фильтр действий для настройки LastAccessDate пользовательского свойства. При извлечении записи пользователя из базы данных я получаю NullReferenceException . Как избавиться от этого исключения? Вот мой фильтр действий:

 public class LogActivity : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var resultContext = await next();

            var id = int.Parse(resultContext.RouteData.Values["id"].ToString());
            var repo = resultContext.HttpContext.RequestServices.GetService<UserRepo>();
            
            Console.WriteLine(id);
            // var user = await repo.GetRespondent(id);

            var user= repo.GetRespondent(id).Resu< <========= Here Exception occurs

            if (user != null)
            {
                user.LastAccessDate = DateTime.Now;
                await repo.SaveAll();
            }

        }
    }
 

Вот UserRepo метод get моего репозитория:

 public async Task<User> GetRespondent(int id)
        {
             var user= await _context.User.FirstOrDefaultAsync(u => u.Id == id);
            if (user!= null)
                 return user

            return null;
        }
 

Ответ №1:

Замените эту строку

 var user= repo.GetRespondent(id).Resu< <========= Here Exception occurs
 

с

 var user = await repo.GetRespondent(id);

 

Комментарии:

1. Я протестировал его, но получил такое же исключение

2. Является ли репозиторий нулевым в этом операторе? Если да, то вам нужно проверить, правильно ли настроен ваш GetService

3. Вы должны использовать GetRequiredService. Этот метод завершается с ошибкой, если невозможно создать экземпляр службы, и вы сразу узнаете об этом. С другой стороны, GetService не сообщит вам, если произойдет сбой, и вам нужно будет выполнить нулевые проверки перед использованием экземпляра — в этом случае ваш репозиторий, вероятно, не создается, что вы заметите, если переключитесь на GetRequiredService

4. Да, репозиторий был фактически нулевым. использование GetRequiredService теперь говорит, что сервис не зарегистрирован, но я регистрирую его в Startup.cs, используя services.AddScoped<IUserRepo, UserRepo>();

5. Хорошо, я использовал resultContext.HttpContext.RequestServices.GetRequiredService<UserRepo>() там, где UserRepo должно быть IUserRepo . Спасибо за помощь.