问题与[Inject],不工作在c#类(Blazor)



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

工作完美,感谢在这里帮助我的人。但当我在课堂上尝试这样做时,它就出错了。我试着:

[Inject]
InvokeMyJavaScript ij { get; set; }
private async Task TestnaarJs()
{
await ij.InvokeMyJs();
}

但是我收到一个错误:对象引用没有设置为对象的实例。我不知道出了什么问题……如何在类中注入?

[Inject]属性是为组件工作的,但为了注入到正常的类中,则使用构造函数注入。阅读更多关于这里

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

//...
private InvokeMyJavaScript ij;
//CTOR
public MyServiceClass(InvokeMyJavaScript ij) {
this.ij = ij;
}
private async Task TestnaarJs() {
await ij.InvokeMyJs();
}
//...

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

相关内容

  • 没有找到相关文章

最新更新