在组件中使用 DI 与注入效果很好(@inject 或在代码隐藏中使用 [inject])。
现在如果你想在普通类中使用 DI 如何工作呢?我在这里发现了完全相同的问题:
Blazor - 从 C# 类调用 JavaScript https://stackoverflow.com/questions/68664268/blazor-call-javascript-from-c-sharp-class
不幸的是,尽管问题被标记为已回答,但尚不清楚这实际上应该如何工作。我将在这里总结一下:
- 您创建一个应用作 DI 的类,例如用于 JSInterop(例如,在组件外部使用 JavaScript):
public class JsInteropForClasses
{
private readonly IJSRuntime jSRuntime;
public JsInteropForClasses(IJSRuntime jSRuntime)
{
this.jSRuntime = jSRuntime;
}
public async void MessageBox()
{
await jSRuntime.InvokeVoidAsync("MessageBox", "DI question!!!");
}
}
- 您在 Program.cs 中注册服务
builder.Services.AddTransient<JsInteropForClasses>();
- 现在关键的问题来了,如何在其他不是组件的类中使用它(所以不能使用注入)?
我应用了建议的解决方案,但我遇到了参数问题,因为 DI 类的构造函数需要对象类型 IJSRuntime 并且我在创建过程中没有传递任何内容:
JsInteropForClasses js = new JsInteropForClasses();
js.MessageBox();
因此,我无法使用DI(因为程序无法启动)。
以下变体也不起作用:
JsInteropForClasses js;
js.MessageBox();
我搜索了很长时间,但只找到了这一条目(见链接)。所有其他均指 DI 和组件。
有谁知道如何在自己的类(而不是组件)中使用 DI?
Thanks
当您在 DI 容器(在 Program.cs 中)中注册服务时,服务的初始化将由 DI 处理。这意味着您不应该自己调用构造函数。您唯一需要做的就是正确注册服务(如果需要,使用接口)。像这样:
builder.Services.AddTransient<JsInteropForClasses>();
or
builder.Services.AddTransient<IJsInteropForClasses, JsInteropForClasses>();
然后,您可以在要使用的类构造函数中注入服务(或服务的接口)。
喜欢:
public class SomeClass {
private readonly JsInteropForClasses jsInteropForClasses;
public SomeClass(JsInteropForClasses jsInteropForClasses) {
this.jsInteropForClasses = jsInteropForClasses;
}
}
或在 Razor 中,如 Henk 所示here https://stackoverflow.com/a/68664615/16542881
@inject JsInteropForClasses ij
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)