Blazor 组件文件中的依赖注入
Dependency Injection In Blazor Component file
我的应用程序中有一个 blazor 组件:
public class IndexComponent : ComponentBase
{
public string ContentRoot { get; set; }
public string WebRoot { get; set; }
private IHostingEnvironment HostingEnvironment;
public IndexComponent(IHostingEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
}
protected override async Task OnInitAsync()
{
//Some Code Here
}
}
我正在尝试在我的应用程序中使用 DI,例如 IHostingEnvironment。
这里的代码没有给出编译时错误,但是当我 运行 它比这个剃须刀文件的代码隐藏文件(Index.razor.g.cs 文件):
public class Index : IndexComponent
在这一行它说:
There is no argument given that corresponds to the required formal
parameter hostingEnvironment of IndexComponent.IndexComponent
这可以通过在 Razor 文件中使用 @inject IHostingEnvironment 来解决,但我正在将我的功能块从 Razor 移动到 IndexComponent.cs 文件,所以在那里需要它。
以下两种方式均无效:
[Inject]
IHostingEnvironment HostingEnvironment
这里有什么用?
注意:未使用 ViewModel
更新 1
在 StartUp.cs 中添加命名空间
using Microsoft.AspNetCore.Hosting.Internal;
比
services.AddSingleton<IHostingEnvironment>(new HostingEnvironment());
它现在可以在客户端项目上注册 IHostingEnvironment,但它的属性(contentrootpath 和 webrootpath)没有值。
这里只有一个可用的东西是 EnvironmentName ,它的值总是 Production ,
更新:
错误来自 WebAssembly,因此它是一个客户端应用程序。客户端上没有 HostingEnvironment,因此未注册该服务。如果是的话那也没用。
所以,退一步:为什么(你认为)你需要它?
您应该将其设置为受保护的或 public read/write 属性:
// in IndexComponent
[Inject]
protected IHostingEnvironment HostingEnvironment { get; set; }
并删除构造函数参数。
旁注:IHostingEnvironment
已标记为已过时。
来自这条评论:
WASM: System.InvalidOperationException: Cannot provide a value for property 'HostingEnvironment' on type 'JewelShut.Client.Pages.Index'. There is no registered service of type 'Microsoft.AspNetCore.Hosting.IHostingEnvironment'
我猜这是一个客户端 Blazor 应用程序。 (如果我的猜测有误,我深表歉意。)。在客户端 Blazor 中,IHostingEnvironment
默认情况下未在 DI 容器中注册。错误仍然是您尝试注入的服务未注册。要注册服务:
在Startup.cs中:
public void ConfigureServices(IServiceCollection services)
{
//few sample for you
services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();
services.AddAuthorizationCore();
//register the required services
//services.Add...
}
如果按照@Henk Holterman 所建议的方式注册注入的服务是正确的答案。
事实证明,对于 Blazor,您需要一个稍微不同的界面,即 IWebAssemblyHostEnvironment
。
由此documentation,你应该注入的是:
@inject IWebAssemblyHostEnvironment HostEnvironment
我的应用程序中有一个 blazor 组件:
public class IndexComponent : ComponentBase
{
public string ContentRoot { get; set; }
public string WebRoot { get; set; }
private IHostingEnvironment HostingEnvironment;
public IndexComponent(IHostingEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
}
protected override async Task OnInitAsync()
{
//Some Code Here
}
}
我正在尝试在我的应用程序中使用 DI,例如 IHostingEnvironment。
这里的代码没有给出编译时错误,但是当我 运行 它比这个剃须刀文件的代码隐藏文件(Index.razor.g.cs 文件):
public class Index : IndexComponent
在这一行它说:
There is no argument given that corresponds to the required formal parameter hostingEnvironment of IndexComponent.IndexComponent
这可以通过在 Razor 文件中使用 @inject IHostingEnvironment 来解决,但我正在将我的功能块从 Razor 移动到 IndexComponent.cs 文件,所以在那里需要它。
以下两种方式均无效:
[Inject]
IHostingEnvironment HostingEnvironment
这里有什么用?
注意:未使用 ViewModel
更新 1
在 StartUp.cs 中添加命名空间
using Microsoft.AspNetCore.Hosting.Internal;
比
services.AddSingleton<IHostingEnvironment>(new HostingEnvironment());
它现在可以在客户端项目上注册 IHostingEnvironment,但它的属性(contentrootpath 和 webrootpath)没有值。
这里只有一个可用的东西是 EnvironmentName ,它的值总是 Production ,
更新:
错误来自 WebAssembly,因此它是一个客户端应用程序。客户端上没有 HostingEnvironment,因此未注册该服务。如果是的话那也没用。
所以,退一步:为什么(你认为)你需要它?
您应该将其设置为受保护的或 public read/write 属性:
// in IndexComponent
[Inject]
protected IHostingEnvironment HostingEnvironment { get; set; }
并删除构造函数参数。
旁注:IHostingEnvironment
已标记为已过时。
来自这条评论:
WASM: System.InvalidOperationException: Cannot provide a value for property 'HostingEnvironment' on type 'JewelShut.Client.Pages.Index'. There is no registered service of type 'Microsoft.AspNetCore.Hosting.IHostingEnvironment'
我猜这是一个客户端 Blazor 应用程序。 (如果我的猜测有误,我深表歉意。)。在客户端 Blazor 中,IHostingEnvironment
默认情况下未在 DI 容器中注册。错误仍然是您尝试注入的服务未注册。要注册服务:
在Startup.cs中:
public void ConfigureServices(IServiceCollection services)
{
//few sample for you
services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();
services.AddAuthorizationCore();
//register the required services
//services.Add...
}
如果按照@Henk Holterman 所建议的方式注册注入的服务是正确的答案。
事实证明,对于 Blazor,您需要一个稍微不同的界面,即 IWebAssemblyHostEnvironment
。
由此documentation,你应该注入的是:
@inject IWebAssemblyHostEnvironment HostEnvironment