【问题标题】:C# ASP.NET Core [Inject] Attribute Usage for Dependency InjectionC# ASP.NET Core [Inject] 依赖注入的属性用法
【发布时间】:2021-04-14 03:57:19
【问题描述】:

我一直在一个运行良好的构造函数中使用依赖注入。我最近了解了 [Inject] 属性,但似乎无法让它工作。也许它不兼容,或者我滥用了它。

在 Startup.cs 中将其注册为服务:

services.AddScoped<IUserProfileService, UserProfileService>();

将其用作具有 [Inject] 属性的属性:

[Microsoft.AspNetCore.Components.Inject]
private IUserProfileService _UserProfileService { get; set; }

当 _UserProfileService 被调用时,它还没有被初始化并且仍然为空。如果我切换回在构造函数中注入它,它会起作用。我是在滥用属性还是根本不可能?

ASP.Net Core 3.1,使用 Blazor

【问题讨论】:

标签: c# asp.net-core dependency-injection


【解决方案1】:

[Inject] 属性仅适用于 Blazor 组件。属性注入不会应用于对IServiceCollection 的注册,即使您使用[Inject] 标记这些属性。内置 DI Container 无法应用属性注入。

InjectAttribute 存在的唯一原因是在 Razor 页面中使用 @inject 标记。当您使用 @inject 标记时,Blazor 将在您的 Blazor 组件上生成一个公共属性,该属性标记为 [Inject]

虽然 Property Injectiondescribed as a valid patternDIPP&P 中练习 DI(第 4.4 节),但这本书也警告了 Property Injection 的缺点,作者(Mark Seemann 和我)指出:

在构建应用程序时 [...] 我们从不使用 Property Injection,您应该谨慎使用。即使您可能为依赖项设置了 Local DefaultConstructor Injection 仍然为您提供了更好的选择。 构造函数注入更简单、更健壮。你可能认为你需要属性注入来解决循环依赖,但这是一种代码味道,我们将在第 6 章中解释。

因此,尽可能避免使用属性注入,而是使用构造函数注入作为向消费者提供依赖项的唯一方式。

【讨论】:

  • 我有一个基类 Base 和子类 Sub1、Sub2、...、SubN,我想向 Base 添加一个注入属性,然后我必须更改所有 Subs 的所有构造函数来转发那个新的财产。是否有使用构造函数注入解决此问题的标准模式?
  • 嗨@Panke,很难用这样的通用示例给出具体指导,但一般来说,你应该避免使用基类 i.c.w。 DI 并且更喜欢使用Composition over Inheritance。有许多设计原则、模式和重构对此有所帮助。例如SOLID principlesdecorator pattern 之类的模式以及Facade Services 之类的重构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多