我的应用程序中有一个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
在这一行说:
没有给出与所需形式相对应的参数 IndexComponent.IndexComponent的参数hostingEnvironment
这可以通过在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
答案 0 :(得分:3)
更新:
该错误来自WebAssembly,因此它是一个客户端应用程序。客户端上没有HostingEnvironment,因此未注册服务。如果是这样,那将是无用的。
因此,退后一步:为什么(您认为)您需要它?
您应该将其设置为受保护或公共的读/写属性:
// in IndexComponent
[Inject]
protected IHostingEnvironment HostingEnvironment { get; set; }
并删除构造函数参数。
旁注:IHostingEnvironment
被标记为过时。
答案 1 :(得分:2)
事实证明,对于 Blazor,您需要一个稍微不同的界面,即 IWebAssemblyHostEnvironment
。
从这个 documentation,你应该注入的是:
@inject IWebAssemblyHostEnvironment HostEnvironment
答案 2 :(得分:1)
此评论:
WASM:System.InvalidOperationException:无法为类型'JewelShut.Client.Pages.Index'的属性'HostingEnvironment'提供值。没有类型为“ 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...
}
If the injected service is registered the way @Henk Holterman has suggested is the right answer.
[Di in blazor][1]
[1]: https://docs.microsoft.com/en-us/aspnet/core/blazor/dependency-injection?view=aspnetcore-3.0