c# - Blazor (.net 7) 中的三种依赖注入(inject)语法有区别吗?

据我所知,所有这三种模式都可以在 Blazor (.net 7/C#/Razor) 项目中注入(inject) DI 服务:

  1. 在 Razor 组件中@inject NavigationManager NavManager
  2. [注入(inject)] private NavigationManager NavManager { get;放; 在类定义中
  3. 典型的 DI 模式:
   private readonly IMyDependency _myDependency;
   public Index2Model(IMyDependency myDependency)
   {
       _myDependency = myDependency;            
   }

据我所知,它们都有效。

它们的实现有什么区别吗?使用其中的任何一个或全部安全吗?

谢谢!

最佳答案

Dimitris 回答的附加信息。

是的,1/2 和 3 之间存在差异。组件的注入(inject)过程(由 Renderer 过程处理)在 Ctor 之后运行。您不能在 Ctor 中使用任何 DI 服务。

1 和 2 之间的区别是可空性。

  1. 使用 @inject,Razor 编译器禁用属性的可空检查。
  2. 使用[Inject],您需要手动处理。执行此操作的正常方法是将 default! 设置为默认值。一旦您到达 SetParametersAsync 并且正常的生命周期方法将永远不会为 null,因为如果找不到服务,运行时将在注入(inject)过程中抛出异常。
[Inject] private NavigationManager NavManager { get; set; } = default!;

https://stackoverflow.com/questions/75014794/

相关文章:

LUA - 表中最常见的项目

c# - C# 是否有某种 value_or_execute 或 value_or_throw?

haskell - 减少围绕手工包装的 `Num` 类型的样板

powershell - 如何在 PowerShell 方法链接中使用换行符

r - 在 mutate 中将参数传递给 pmap

regex - Linux 提取特定字符串之间的文本

python - 无法使用调试暂停 python 进程

arrays - 如何将数组的元素移动到数组的开头

python - 什么时候值得在 if-else 语句上使用循环?

r - 如何将整行作为列名?