如何解决Blazor Server组件中依赖注入ASP.NET Core Identity UserManager时的CS7036错误
解决Blazor Server组件基类构造函数注入的CS7036错误
这个错误的核心原因是Blazor Server的组件实例是由框架直接创建的,而非依赖注入(DI)容器,所以你没法通过构造函数来注入UserManager<ApplicationUser>——框架不知道该怎么给你的基类构造函数传递这个参数,自然就会报找不到对应实参的错误。
正确的解决方式:使用属性注入
Blazor组件的标准依赖注入方式是用[Inject]特性标记属性,框架会在组件初始化前自动完成注入。修改你的基类代码如下:
namespace UsersComponent { public class UsersBase : ComponentBase { // 用[Inject]标记,设置为protected方便子类组件访问 [Inject] protected UserManager<ApplicationUser> UserManager { get; set; } = default!; } }
在子类组件中使用
然后你的Blazor页面(比如Users.razor)继承这个基类后,就可以直接在代码逻辑里使用UserManager了:
@inherits UsersBase <h3>管理员用户管理</h3> @if (_users != null) { <ul> @foreach (var user in _users) { <li>@user.UserName - @user.Email</li> } </ul> } @code { private List<ApplicationUser>? _users; protected override async Task OnInitializedAsync() { // 直接使用基类中注入的UserManager _users = await UserManager.Users.ToListAsync(); } }
补充说明
default!是用来消除空引用警告的,因为我们明确知道DI框架会在组件初始化完成前注入这个属性,所以它不会是null。- 如果你坚持想用构造函数注入(不推荐,不符合Blazor最佳实践),需要把你的组件类型注册到DI容器中,然后通过服务定位器获取实例,但这种方式会增加代码复杂度,也不利于组件的可维护性。
内容的提问来源于stack exchange,提问作者Joel Mason
相关产品推荐
相关产品推荐

