#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
. Спасибо за помощь.