控制器中其他类的.net核心Web API访问变量

时间:2018-09-16 11:37:34

标签: c# asp.net-core asp.net-core-webapi

在我的asp.net核心Web API中,我想访问控制器中的变量。该变量将在GetAllStudents方法运行时设置。 StudentController和StudentRepository在同一解决方案中,但项目不同。如何从StudentRepository.cs访问StudentController.cs中的变量?有一些针对MVC的解决方案,但找不到Web API。因此,问题是不重复

StudentController.cs:

 int requestedUserId;

 [HttpGet("GetAllStudents")]
 public async Task<ServiceResult>GetAllStudents()
    {
        requestedUserId= context.HttpContext.Request.Headers["Authorization"];
        return await (studentService.GetAllStudents(requestedUserId));
    }

StudentService.cs:

 public async Task<ServiceResult> GetAllStudents()
    {
        return await unitOfWork.studentRepo.GetAllStudents();
    }

StudentRepository.cs:

public async Task<List<Student>> GetAllStudents()
    {
        ?????var requestedUserId= StudentController.requestedUserId;?????
        LogOperation(requestedUserId);
        return context.Students.ToList();
    }

2 个答案:

答案 0 :(得分:1)

您可以将其传递进来。

GetAllStudents(int userId)


更新:

回复:谢谢您的答复。但是此变量在每个控制器中的每种方法中都使用。所以我不想到处写(int userId)。

您应该将其传递给需要它的每个方法:

  1. 这是常见的模式
  2. 方法不依赖于控制器
  3. 传递它实际上比以下代码少var requestedUserId= StudentController.requestedUserId;?????

答案 1 :(得分:0)

我找到了解决方案。解决方案是“ IHttpContextAccessor”。您可以通过依赖项注入来注入,然后可以在任何地方使用(例如dbcontext类)

public class StudentService : IStudentService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public StudentService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

public async Task<List<Student>> GetAllStudents()
    {
        var requestedUserId= _httpContextAccessor.HttpContext.Headers["Authorization"];
        LogOperation(requestedUserId);
        return context.Students.ToList();
    }
}