为什么我们必须为每个操作方法调用await_userManager.GetUserAsync(User)?

时间:2017-10-06 18:30:19

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

老实说,我不明白基于asp.net核心的Web应用程序是如何工作的。现在我正试图一点一点地弄清楚它在幕后的作用。

让我们考虑选择Individual User Account的默认模板。更确切地说,在ManageController类中如下。

namespace StackOverflow.Controllers
{
    [Authorize]
    [Route("[controller]/[action]")]
    public class ManageController : Controller
    {
        // others are trimmed for the sake of simplicity 

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EnableAuthenticator(EnableAuthenticatorViewModel model)
        {
            // ..........

            var user = await _userManager.GetUserAsync(User);
            // ........
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> ResetAuthenticator()
        {
            var user = await _userManager.GetUserAsync(User);
            //.......
        }

        [HttpGet]
        public async Task<IActionResult> GenerateRecoveryCodes()
        {
            var user = await _userManager.GetUserAsync(User);
            // ..........
        }        
}

问题

声明

var user = await _userManager.GetUserAsync(User);

几乎出现在每个动作方法中。

为什么我们必须为每个操作方法调用await _userManager.GetUserAsync(User)?为什么我们不把它作为一个类属性?

1 个答案:

答案 0 :(得分:2)

要使用类属性,您需要异步属性。这在C#中是不可能的--Stephen Cleary详细介绍了这个主题here

  

这是一个有目的的设计决策,因为“异步属性”是矛盾的。物业获取者应该返回当前值;他们不应该开始背景操作。此外,“异步设置器”背后的语义并不清楚。

虽然您可以阻止异步代码,但不建议这样做。 Stephen Cleary在该主题上发表了另一篇文章here

  

然而,你不应该。因为你阻止异步代码的那一刻,你首先放弃了异步代码的所有好处。一旦阻塞线程,异步处理程序的增强可伸缩性就会无效。