[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 注释的
Kotlin + Dagger2:不能在没有 @Inject 构造函数或 @Provides- 或 @Produces-annotated 方法的情况下提供