据我所知,所有这三种模式都可以在 Blazor (.net 7/C#/Razor) 项目中注入(inject) DI 服务:
在 Razor 组件中@inject NavigationManager NavManager
[注入(inject)] private NavigationManager NavManager { get;放;
在类定义中 private readonly IMyDependency _myDependency;
public Index2Model(IMyDependency myDependency)
{
_myDependency = myDependency;
}
据我所知,它们都有效。
它们的实现有什么区别吗?使用其中的任何一个或全部安全吗?
谢谢!
最佳答案
Dimitris 回答的附加信息。
是的,1/2 和 3 之间存在差异。组件的注入(inject)过程(由 Renderer 过程处理)在 Ctor 之后运行。您不能在 Ctor 中使用任何 DI 服务。
1 和 2 之间的区别是可空性。
@inject
,Razor 编译器禁用属性的可空检查。[Inject]
,您需要手动处理。执行此操作的正常方法是将 default!
设置为默认值。一旦您到达 SetParametersAsync
并且正常的生命周期方法将永远不会为 null,因为如果找不到服务,运行时将在注入(inject)过程中抛出异常。[Inject] private NavigationManager NavManager { get; set; } = default!;
https://stackoverflow.com/questions/75014794/