Blazor组件为何需要使用属性注入,构造函数注入无法生效的原因是什么?
Blazor组件构造函数注入失效的核心原因
- Blazor的组件实例默认由框架的渲染引擎直接创建,不会走.NET依赖注入容器的实例化流程,DI容器自然不会向构造函数传递已注册的服务实例。
- 渲染引擎创建组件时只会调用无参构造函数,如果你给组件定义了带参数的构造函数又没有显式声明无参构造,运行时会直接抛出找不到有效构造函数的异常。
[Inject]属性注入是Blazor框架单独实现的逻辑:渲染引擎完成组件实例化后,会自动扫描组件中标记了[Inject]特性的属性,从DI容器中拉取对应服务完成赋值,和常规DI的构造注入逻辑相互独立。
补充:.NET 6 及以上版本已经支持Blazor组件的构造函数注入,需要额外将组件注册到DI容器即可生效,示例配置如下:
// Program.cs 中添加注册 builder.Services.AddTransient<EmployeeOverview>();不过因为需要提前注册所有用到注入的组件,开发成本比直接用
[Inject]属性注入高,所以官方还是更推荐使用属性注入的写法。
内容的提问来源于stack exchange,提问作者VivekDev
相关产品推荐
相关产品推荐

