Blazor中@inject与[Inject]依赖注入用法存在本质区别吗?
Blazor 两种依赖注入写法对比
我们先整理两种常见的页面实现,再对比如下:
写法1:Razor 指令注入(SomePage.razor)
@inject Something something @page "/somepage" <h1> My Page </h1> @code { // 在此处使用"Something" ... }
写法2:特性标记注入(AnotherPage.razor)
@page "/anotherpage" <h1> My Page </h1> @code { [Inject] Something something { get; set; } // 在此处使用"Something" ... }
核心问题解答
本质区别与运行效果
两种写法没有本质区别,运行时的最终效果完全一致,绝大多数场景下的选择差异只是开发者的编程偏好,或是语法适配场景的不同。
Razor 编译管线在处理代码时,会自动把@inject指令转换为和手动编写[Inject]特性完全等价的属性定义,后续的依赖解析逻辑、服务生命周期管理、实例获取流程没有任何区别:
- 两种方式的服务解析时机都是在组件初始化阶段(
OnInitialized/OnInitializedAsync) - 两种方式获取到的服务实例,完全跟随DI容器注册时配置的生命周期(Transient/Scoped/Singleton),不会出现实例不一致的问题
- 不存在任何性能差异,因为最终生成的组件类代码在注入逻辑上是完全等价的
场景适配的细微差异
两种写法因为语法位置的区别,适合的使用场景略有不同,但不属于功能层面的区别:
@inject指令写在Razor页面的头部区域,适合注入需要在HTML渲染标记中直接调用的服务,写法更简洁,不需要手动声明属性的访问修饰符[Inject]特性需要写在@code块的属性定义中,要求注入的属性必须是可读写的非私有属性,适合注入逻辑代码中使用的服务;如果是在组件基类中定义通用的注入服务,只能通过[Inject]特性的方式实现
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

