📜  在构造函数和 oninit 中调用当前用户有什么不同 (1)

📅  最后修改于: 2023-12-03 14:51:29.439000             🧑  作者: Mango

在构造函数和 oninit 中调用当前用户有什么不同

当开发ASP.NET Core应用程序时,获取有关当前用户的信息对于许多应用程序都是至关重要的。常见的做法是在构造函数中调用HttpContext以获取当前用户,但是在OnInitialized方法中调用AuthenticationStateProvider.GetAuthenticationStateAsync()获取当前用户也是可行的。

构造函数调用

在构造函数中调用当前用户比在OnInit方法中调用更加直接,因为可以直接在构造函数中获取到HttpContext。但是,在构造函数中获取当前用户也有一些缺点。

第一点,在构造函数调用HttpContext时可能会发生异常。如果此时HttpContextnull,则会抛出NullReferenceException异常。您可以使用RequestServices来获取它,但是这也可能引发异常。

第二点,在构造函数中调用HttpContext可能会导致单元测试运行失败。这是因为单元测试框架通常不会为您创建完整的HttpContext。该问题通常可以通过将依赖项注入到构造函数中而不是调用HttpContext来解决。

public class MyComponent : ComponentBase
{
    private readonly IHttpContextAccessor _httpContextAccessor;

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

    protected override void OnInitialized()
    {
        // This will work for both server-side rendering and Blazor WASM
        var user = _httpContextAccessor.HttpContext?.User;
        // ...
    }
}
OnInitialized 调用

OnInitialized方法中调用AuthenticationStateProvider.GetAuthenticationStateAsync()可以确保您获取到的是最新的身份验证状态。这是因为在首次加载组件时和每次发生身份验证状态更改时,都会调用OnInitialized

使用AuthenticationStateProvider.GetAuthenticationStateAsync()在 Blazor WebAssembly中获取当前用户的位置

public class MyComponent : ComponentBase
{
    [Inject] private AuthenticationStateProvider AuthenticationStateProvider { get; set; }

    protected override async Task OnInitializedAsync()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;
        // ...
    }
}

在 Blazor Server中获取当前用户的位置:

public class MyComponent : ComponentBase
{
    [Inject] private AuthenticationStateProvider AuthenticationStateProvider { get; set; }

    protected override async Task OnInitializedAsync()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;
        // ...
    }
}
总结

总之,在构造函数和OnInitialized中获取当前用户各有优缺点。在构造函数中获取当前用户更直接,但也可能会导致单元测试失败。在OnInitialized中调用AuthenticationStateProvider.GetAuthenticationStateAsync()则会确保获取到的是最新的身份验证状态。根据实际情况选择最适合您的方法即可。