【问题标题】:Dependency Injection In Blazor Component fileBlazor 组件文件中的依赖注入
【发布时间】:2020-01-22 14:38:54
【问题描述】:

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

【问题讨论】:

  • 你的代码没有错。看起来您正在某处手动创建一些新的索引或索引组件。
  • @daniherrera 是的,这是将代码与另一个文件中的 html 标记分离并继承该类文件中的 ComponentBase 的标准方法,直到我们在 ASP.Net Blazor 中使用依赖注入。它给出了错误
  • 我在代码组件上广泛使用 DI,没有任何问题。您是否尝试在某个地方手动创建组件的新实例?这种错误(缺少 DI 元素)通常是在运行时而不是在编译时引发的。
  • 不,没有使用new关键字来创建组件实例
  • @daniherrera 请参阅更新 1

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


【解决方案1】:

更新:

错误来自 WebAssembly,因此它是一个客户端应用程序。客户端上没有 HostingEnvironment,因此该服务未注册。如果是的话就没有用了。

所以,退后一步:为什么(你认为)你需要它?


您应该将其设为受保护的或公共的读/写属性:

// in IndexComponent
[Inject]
protected IHostingEnvironment HostingEnvironment { get; set; }

并删除构造函数参数。

旁注:IHostingEnvironment 被标记为已过时。

【讨论】:

  • WASM:System.InvalidOperationException:无法为类型“JewelShut.Client.Pages.Index”的属性“HostingEnvironment”提供值。没有“Microsoft.AspNetCore.Hosting.IHostingEnvironment”类型的注册服务。
  • 这样在控制台弹出这条消息
  • 它适用于我在服务器端的 RC1 上。啊,它是客户端。我会更新的。
  • 是的问题出在客户端项目部分,在服务器项目中工作正常
  • 那么你需要一个 HostingEnvironment 在客户端做什么?
【解决方案2】:

事实证明,对于 Blazor,您需要一个稍微不同的界面,即IWebAssemblyHostEnvironment

从这个documentation,你应该注入的是:

@inject IWebAssemblyHostEnvironment HostEnvironment

【讨论】:

    【解决方案3】:

    来自此评论:

    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...
    }
    
    

    如果注入的服务按照@Henk Holterman 建议的方式注册是正确的答案。

    Di in blazor

    【讨论】:

    • 默认服务不注册就不能工作吗?我使用的模板是托管的服务器端 asp.net 核心,它具有三个项目 - 客户端、服务器、共享。我在客户项目中遇到问题
    • 托管版本不是服务器端 Blazor!托管版本使用 asp.net 核心作为服务器。服务器端 Blazor 不会为服务器、客户端和共享创建单独的项目。托管模板仍然使用 WebAssembly 作为客户端。 DI 不共享。
    • 我们需要在客户端项目上注册默认服务吗??
    • 请参阅更新 1
    • 这里是IHostingEnvironment的文档。它声明它将从环境变量中读取一些属性,并且一些属性需要文件访问。出于安全原因,浏览器不允许任何文件访问。这就是为什么在浏览器中使用这个界面没有多大意义。如果您真的需要浏览器的一些上下文,如果您可以从 javascript 端获取信息并使用 jsinterop 解析数据,我会研究它。这是你最好的镜头
    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2020-08-14
    • 2021-01-26
    • 1970-01-01
    • 2019-11-19
    • 2016-09-15
    • 2016-09-10
    • 2016-04-25
    相关资源
    最近更新 更多