Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C ASP.NET核心[Inject]依赖项注入的属性用法_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

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

C# C ASP.NET核心[Inject]依赖项注入的属性用法,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我一直在一个构造函数中使用依赖项注入,它工作得很好。我最近了解了[Inject]属性,但似乎无法使其正常工作。也许它不兼容,或者我误用了它 在Startup.cs中将其注册为服务: services.AddScoped<IUserProfileService, UserProfileService>(); 调用_UserProfileService时,它尚未初始化,仍然为null。如果我切换回在构造函数中注入它,它就会工作。我是误用了属性还是根本不可能 ASP.Net Core 3

我一直在一个构造函数中使用依赖项注入,它工作得很好。我最近了解了[Inject]属性,但似乎无法使其正常工作。也许它不兼容,或者我误用了它

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

services.AddScoped<IUserProfileService, UserProfileService>();
调用_UserProfileService时,它尚未初始化,仍然为null。如果我切换回在构造函数中注入它,它就会工作。我是误用了属性还是根本不可能

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

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

尽管第4.4节是为了实践DI,但本书也警告了财产注入的负面影响,作者Mark Seemann和我声明:

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

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

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

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

尽管第4.4节是为了实践DI,但本书也警告了财产注入的负面影响,作者Mark Seemann和我声明:

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


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

该属性属于什么?此处的一些有趣阅读文档该属性属于什么?此处的一些有趣阅读文档
[Microsoft.AspNetCore.Components.Inject]
private IUserProfileService _UserProfileService { get; set; }