混合 Blazor 组件、DI 和 C# 8 可为空

Nic*_*tte 15 c# dependency-injection blazor .net-5

我在启用可为 null 的项目中使用 .net 5 作为 Blazor 应用程序。它使用代码隐藏来创建 Blazor 组件。我想使用构造函数,这样我就可以避免将每个非 DI 属性标记为可为空,以简化在 blazor 代码中对它们的访问。但是,如果我创建一个像这样的构造函数 public PageNumberOne(ILogger<PrimaryItem> logger) {}

我收到错误MissingMethodException: 没有为类型定义无参数构造函数

如果我在 DI 项上使用注入属性,则会收到警告 -当激发构造函数时,不可为空的属性 _logger 必须包含非空值

那么如何将 DI 与可为 null 混合,而不只是将每个属性标记为可为 null?

我还可以在“代码”块的主体中​​创建它们,但随后我无法访问我的 DI 项进行初始化,因为它们在 OnInitialized 之前不可用。所以我必须再次将它们标记为可为空。

dan*_*era 22

来自ASP.NET Core Blazor 依赖注入文档中的组件中请求服务的 Microsoft 建议:

由于注入的服务预计可用,因此不要将注入的服务标记为可为空。相反,使用 null-forgiving 运算符分配默认文字(默认!)。

[Inject]
private IExampleService ExampleService { get; set; } = default!;
Run Code Online (Sandbox Code Playgroud)

  • 或者,假设注入可以工作并声明像“public NavigationManager MyNavigationManager {get;”这样的属性。设置;} = 默认!;` (3认同)