У меня есть пользовательский класс диспетчера пользователей (ASP .NET Identity). Я хочу переопределить FindByIdMethod, чтобы он автоматически загружал имена ролей для пользовательской модели. Это единственный метод, который я переопределяю. Я использую Microsoft.Identity
пакеты nuget версии 2.2.1, Asp.Net Framework.
Однако приведенный ниже код вызывает исключение StackOverflow - на await base.FindByIdAsync(userId);
public class MyUserManager : UserManager<MyUser>, IMyUserManager
{
public override async Task<MyUser> FindByIdAsync(string userId)
{
var user = await base.FindByIdAsync(userId);
user.RoleNames = await this.GetRolesAsync(user.Id);
return user;
}
}
Когда я пытаюсь подобный код без добавления «асинхронного» в переопределенную подпись, он работает нормально - однако я не могу загрузить имена своих ролей в этом методе:
public override Task<MyUser> FindByIdAsync(string userId)
{
var userTask = base.FindByIdAsync(userId); //no errors in this approach
return userTask; //but also no custom behaviour
}
Я подозреваю, что IMyUserManager может быть проблематичным, но он мне нужен для IOC / DI. Это был автоматически сгенерированный интерфейс, поэтому он имеет все открытые члены класса UserManager.
Класс пользователя:
public class MyUser: IdentityUser
{
public string DisplayName { get; set; }
public bool IsActivated { get; set; }
public bool MustChangePassword { get; set; }
public IList<string> RoleNames { get; set; } = new List<string>();
}
Сведения об исключении:
Стек вызовов (TelimenaUserManager = MyUserManager, я упростил имя)
ОБНОВЛЕНИЕ:
Благодаря предложениям Хенка в комментариях я вижу, что рекурсия происходит в методе GetRolesAsync ...