C# ASP.NET Core [Inject] 依赖注入的属性用法

Iza*_*cch 7 c# dependency-injection asp.net-core

我一直在构造函数中使用依赖注入,效果很好。我最近了解到 [Inject] 属性,但似乎无法让它发挥作用。也许它不兼容或者也许我滥用它。

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

services.AddScoped<IUserProfileService, UserProfileService>();
Run Code Online (Sandbox Code Playgroud)

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

[Microsoft.AspNetCore.Components.Inject]
private IUserProfileService _UserProfileService { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

ASP.Net Core 3.1,使用 Blazor

Ste*_*ven 15

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

\n

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

\n

尽管属性注入被描述为在DIPP&P中实践 DI 的有效模式(第 4.4 节),但这本书也警告了属性注入的缺点,作者(Mark Seemann 和我)指出:

\n
\n

在构建应用程序时[...]我们从不使用属性注入,您应该谨慎使用。即使您可能有依赖项的本地默认值构造函数注入仍然为您提供了更好的选择。构造函数注入更简单、更健壮。您可能认为需要属性注入来解决循环依赖关系,但这\xe2\x80\x99是一种代码味道,正如我们\xe2\x80\x99将在第6章中解释的那样。

\n
\n

因此,只要有可能,就不要使用属性注入,而使用构造函数注入作为向使用者提供依赖项的唯一方式。

\n