【问题标题】:Problem with [Inject], not working in C# class (Blazor)[Inject] 有问题,不能在 C# 类 (Blazor) 中工作
【发布时间】:2021-10-10 15:03:10
【问题描述】:

我想从 Blazor Wasm 项目中的 .net 类触发一个 JavaScript 函数。 我创建了一个类(客户端)

  public class InvokeMyJavaScript
{
   private readonly IJSRuntime jSRuntime;

   public InvokeMyJavaScript(IJSRuntime jSRuntime)
   {
      this.jSRuntime = jSRuntime;
   }

   public async ValueTask InvokeMyJs()
   {
      await jSRuntime.InvokeVoidAsync("giveMeAMessage");
   }
}

我添加到 Program.cs:

builder.Services.AddTransient<InvokeJavaScript>();

在我的 Razor 组件中,我现在可以这样做:

[Inject]
InvokeMyJavaScript imjs { get; set; }

public async void InvokeMyJs()
{
   await imjs.InvokeMyJs();
}

完美运行,感谢帮助我的人here。但是当我尝试从课堂上做到这一点时,它出错了。 我试过了:

[Inject]
InvokeMyJavaScript ij { get; set; }

private async Task TestnaarJs()
{
   await ij.InvokeMyJs();
}

然后我收到一个错误:对象引用未设置为对象的实例。 我不知道出了什么问题...如何在课堂上进行注入?

【问题讨论】:

  • [Inject] 属性适用于组件。为了注入一个普通的类,然后使用构造函数注入。 Read more about that here

标签: c# dependency-injection blazor


【解决方案1】:

[Inject] 属性适用于组件,但为了注入普通类,请使用构造函数注入。 Read more about that here

@inject(或[Inject] 属性)不可用于服务。必须改用构造函数注入。通过向服务的构造函数添加参数来添加所需的服务。

//...

private InvokeMyJavaScript ij;

//CTOR
public MyServiceClass(InvokeMyJavaScript ij) {
    this.ij = ij;
}

private async Task TestnaarJs() {
   await ij.InvokeMyJs();
}

//...

此外,我建议在接口后面抽象 InvokeMyJavaScript 并注入抽象而不是具体实现,以避免与实现细节/问题的紧密耦合。

【讨论】:

  • 是的!而已。它有效,我正在努力思考。感谢您的明确答复!
猜你喜欢
  • 2014-11-26
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多