[注入] 的问题,在 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。
我想在 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();
}
非常感谢帮助我的人
[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。