#c# #asp.net-core
#c# #asp.сетевое ядро
Вопрос:
Я пытаюсь получить запись для текущего пользователя, вошедшего в систему ASP.NET Основное приложение веб-API, получая идентификатор пользователя от ApplicationUser в IdentityDbContext.
У меня есть эти услуги:
public interface IUserService { string GetCurrentUserId(); } public class UserService : IUserService { private readonly IHttpContextAccessor _httpContextAccessor; private HtmlEncoder _htmlEncoder; public UserService( IHttpContextAccessor httpContextAccessor ) { _httpContextAccessor = httpContextAccessor; } public string GetCurrentUserId() { string currentUserId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; return currentUserId; } } public StudentProfileDto FromStudentProfileToStudentDto(Student student) { var studentDto = new StudentProfileDto()//; { FirstName = student.FirstName, LastName = student.LastName, AdmissionNumber = student.AdmissionNumber, }; return studentDto; }
Затем я применил его здесь:
public interface IStudentService { public Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null); } public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null) { var mapper = new EntityMapper(); var studentProfile = await _unitOfWork.StudentRepository.GetAll(); var studentDtoProfile = studentProfile.Where(x =gt; x.UserId == Convert.ToInt64(user)).Select(c =gt; mapper.FromStudentProfileToStudentDto(c)).ToList(); return studentDtoProfile; }
Базовая установка:
public class BaseRepositorylt;Tgt; : IBaseRepositorylt;Tgt; where T : AuditableBaseEntity { private readonly DDMDbContext _context; private DbSetlt;Tgt; _entities; public BaseRepository(DDMDbContext context) { _context = context; _entities = context.Setlt;Tgt;(); } public async Tasklt;IEnumerablelt;Tgt;gt; GetAll() { var list = await _entities.Where(x =gt; x.IsDeleted == false).ToListAsync(); return list; } public async Task Insert(T entity) { entity.CreatedDate = DateTime.UtcNow; entity.IsDeleted = false; await _entities.AddAsync(entity); } }
UnitOfWork:
public interface IUnitOfWork : IDisposable { IBaseRepositorylt;Studentgt; StudentRepository { get; } void SaveChanges(); Task SaveChangesAsync(); } public class UnitOfWork : IUnitOfWork { private readonly DDMDbContext _context; public UnitOfWork(DDMDbContext context) { _context = context; } private readonly IBaseRepositorylt;Studentgt; _studentRepository; public IBaseRepositorylt;Studentgt; StudentRepository =gt; _studentRepository ?? new BaseRepositorylt;Studentgt;(_context);
Затем, наконец, вызвал его из контроллера:
public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile() { long userId = Convert.ToInt64(_userService.GetCurrentUserId()); return await _studentService.GetStudentProfile(userId); }
Но я получил эту ошибку:
Ошибка CS1503 Аргумент 1: не удается преобразовать из «длинного» в «Идентичность».Пользователь приложения’
Он выделяет идентификатор пользователя в:
возврата ждут _studentService.GetStudentProfile(идентификатор пользователя);
Что мне нужно сделать, чтобы решить эту проблему?
Обновленный Код:
public interface IStudentService { public Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(long? user); } public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(long? user) { var mapper = new EntityMapper(); var studentProfile = await _unitOfWork.StudentRepository.GetAll(); var studentDtoProfile = studentProfile.Where(x =gt; x.UserId == Convert.ToInt64(user)).Select(c =gt; mapper.FromStudentProfileToStudentDto(c)).ToList(); return studentDtoProfile; }
Контроллер:
public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile() { long userId = Convert.ToInt64(_userService.GetCurrentUserId()); return await _studentService.GetStudentProfile(userId); }
Комментарии:
1. Измените
Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null)
, чтобы принять длинный или добавьте новый метод, который будет.2. @Jasen — Как и на что мне его изменить?
3.
GetStudentProfile(long userId)
теперь он принимает длинный параметр.4. @Jasen — У меня также есть Ienumerable в базовой версии, которую я назвал GetAll(). Как мне добиться этого во всем? Смотрите мой код.
5. Почему вы хотите изменить GetAll() ????
Ответ №1:
В вашем методе GetStudentProfile он принимает пользователя приложения в качестве параметра недолго.
Комментарии:
1. Я сделал это, потому что идентификатор текущего пользователя, который я собираю в ApplicationUser, длинный.
2. Я думаю, что метод должен быть следующим: общедоступная задачаlt;IEnumerablelt;StudentProfileDtogt;lt;StudentProfileDtogt;gt; GetStudentProfile(долго? пользователь); }
3. Если я использую это, я не знаю, как еще я смогу получить идентификатор текущего пользователя.
4. В контроллере вы уже получаете идентификатор пользователя как; длинный идентификатор пользователя = Конвертировать. ToInt64 (_Пользовательская служба. GetCurrentUserId()); что верно. Так что только измените этот параметр метода-это служба
5. Когда я изменил его, как вы советовали, он возвращает пустую запись. И все же есть запись для профиля