[Inject] 有问题,不能在 C# 类 (Blazor) 中工作

Posted

技术标签:

【中文标题】[Inject] 有问题,不能在 C# 类 (Blazor) 中工作【英文标题】:Problem with [Inject], not working in C# class (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 【参考方案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 并注入抽象而不是具体实现,以避免与实现细节/问题的紧密耦合。

【讨论】:

是的!而已。它有效,我正在努力思考。感谢您的明确答复!

以上是关于[Inject] 有问题,不能在 C# 类 (Blazor) 中工作的主要内容,如果未能解决你的问题,请参考以下文章

Dagger 2 错误:依赖“不能在没有 @Inject 构造函数的情况下提供”,而它实际上是用 @Inject 注释的

解BL锁的危害都有哪些?

Kotlin + Dagger2:不能在没有 @Inject 构造函数或 @Provides- 或 @Produces-annotated 方法的情况下提供

不解BL锁能不能直接刷机

处理使用typescript在类实例化中反转@inject()参数

为啥在这个 angular2 示例中我仍然需要 @inject?