У меня есть проект .NET Core 2.2 Web Api, где я пытаюсь сделать все, используя подход async / await. У меня есть контроллер под названием «UserController». У меня есть методы в моем "UserController", где мне нужно получить доступ к LoggedInUserId. Итак, для этого я создал «BaseController», от которого «UserController» унаследует.
BaseController.cs
public abstract class BaseController : ControllerBase
{
public int LoggedInUserId
{
get
{
Task<int> task = Task.Run(async () => await GetLoggedInUserId());
return task.Result;
}
}
}
В "BaseController" есть частный метод, называемый "GetLoggedInUserId ()", который будет вызывать базу данных (именно поэтому этот метод должен быть асинхронным) и извлекать нужную мне информацию.
Итак, после понимания, вот мой "UserController"
UserController.cs
[Route("api/[controller]")]
[ApiController]
public class UsersController : BaseController
{
public UsersController()
{
}
[HttpPost("create")]
public async Task<ActionResult<User>> Create([FromBody] userCreate)
{
_userService.CreateUser(userCreate, LoggedInUserId);
}
}
Как вы видите, я обращаюсь к свойству "LoggedInUserId" из "BaseController", но меня беспокоит то, что, поскольку свойство "LoggedInUserId" в "BaseController" возвращает "task.Result", то оно не является действительно асинхронным .
Итак, я подумал о другом способе, заключающемся в том, чтобы удалить свойство «LoggedInUserId» из «BaseController» и сделать метод «GetLoggedInUserId ()» открытым методом вместо частного и получить к нему доступ следующим образом:
UserController.cs
_userService.CreateUser(userCreate, await GetLoggedInUserId());
Итак, мои вопросы таковы:
- Можно ли считать оба этих подхода правильными и соответствуют ли они асинхронному / ожидающему способу выполнения вещей?
- Оба эти подхода выполняют одно и то же?
- Есть ли у них какие-либо недостатки любого из этих двух подходов?
- Если кто-либо увидит какие-либо недостатки в этих подходах, вы можете предложить лучший / более чистый способ достижения моей цели.