Blazor组件文件中的依赖项注入

时间:2019-09-22 07:20:25

标签: c# asp.net-core blazor blazor-client-side

我的应用程序中有一个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

3 个答案:

答案 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