[注入] 的问题,在 C# class (Blazor) 中不起作用

Problem with [Inject], not working in C# class (Blazor)

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

  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();
}

非常感谢帮助我的人。但是当我尝试从 class 执行此操作时,它出错了。 我试过了:

[Inject]
InvokeMyJavaScript ij { get; set; }

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

但随后我收到错误消息:未将对象引用设置为对象的实例。 我不知道出了什么问题...我怎样才能注入 class?

[Inject] 属性适用于组件,但为了注入到正常 类 然后使用构造函数注入。 Read more about that here

@inject (or the [Inject] attribute) isn't available for use in services. Constructor injection must be used instead. Required services are added by adding parameters to the service's constructor.

//...

private InvokeMyJavaScript ij;

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

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

//...

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