在自己的类中使用依赖注入(而不是在组件中)?

2024-01-13

在组件中使用 DI 与注入效果很好(@inject 或在代码隐藏中使用 [inject])。

现在如果你想在普通类中使用 DI 如何工作呢?我在这里发现了完全相同的问题:

Blazor - 从 C# 类调用 JavaScript https://stackoverflow.com/questions/68664268/blazor-call-javascript-from-c-sharp-class

不幸的是,尽管问题被标记为已回答,但尚不清楚这实际上应该如何工作。我将在这里总结一下:

  1. 您创建一个应用作 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!!!");
        }
    }
  1. 您在 Program.cs 中注册服务

builder.Services.AddTransient<JsInteropForClasses>();

  1. 现在关键的问题来了,如何在其他不是组件的类中使用它(所以不能使用注入)? 我应用了建议的解决方案,但我遇到了参数问题,因为 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(使用前将#替换为@)

在自己的类中使用依赖注入(而不是在组件中)? 的相关文章

随机推荐

  • 标准是否指定哪些标头包含其他标头?

    我正在参加一个在线编码竞赛 我的想法是找到一个名称比
  • 导入具有可变标头的 Excel 文件

    我有 SSIS 包 它将把 excel 文件加载到数据库中 我创建了 Excel Source 任务来将 Excel 列名称映射到数据库表列名称 并且其工作正常 在极少数情况下 我们收到带有一些空格的 Excel 文件列名称 例如 列名称是
  • pszBuffer 或类似内容中的“psz”代表什么?

    我知道这有点偏离主题 但我相信无论如何我都能在这里得到答案 什么是 psz 代表在pszBuffer或者C C 系统库中的类似变量 我看到很多变量都带有 前缀 psz 它看起来像一个图案 Thanks This is 匈牙利表示法 http
  • Android xml 形状声明中的滑稽错误

    我正在创建一个形状用作按钮背景 我正在制作一条按钮 左边的按钮在左边有圆角 右边的最后一个在右边有圆角 这非常简单 API 文档向您展示了如何做到这一点 然而 当我使用android topLeftRadius and android bo
  • 请求 JSF 页面时无限 setStatus() 循环

    您好 我已将我的配置和库升级到 hibernate 4 spring 3 1 1 richfaces 4 我在 tomcat 7 上运行 但是当我尝试打开索引页时 服务器运行一个循环 当我尝试在 ViewHandlerResponseWra
  • 如何更改 Huggingface 变压器默认缓存目录

    默认缓存目录磁盘容量不足 我需要更改默认缓存目录的配置 您可以在每次加载模型时指定缓存目录 from pretrained https huggingface co transformers main classes model html
  • Jetpack Compose Text 组件中的等宽数字

    我在 Jetpack Compose 应用程序中使用自定义字体 并且希望将特定文本组件中的数字等宽 对于标准 Android TextView 可以使用fontFeatureSetting tnum 属性 https stackoverfl
  • 在 if 条件中声明变量有什么问题?

    也许我已经生疏了 最近一直在用Python编写 为什么这不能编译 if int i f 0 没有 周围的int i f 我得到另一个更合理的错误i不是布尔值 但这就是为什么我首先想要括号 我的猜测是 使用括号将其放入表达式中 并且表达式中不
  • gvim 的类似尾巴的功能

    我想使用 gvim 来查看不断更新的日志文件 这样我总是可以看到最后更新的行 就像 unix 中的 tail 命令一样 是否可以 打开日志文件和 setlocal autoread 有一个插件 尾束 http www vim org scr
  • 如何使用 OkHttp 启用证书固定

    如何使用 OkHttp 为我的 Android Java 应用程序启用证书固定 The OkHttp 文档 http square github io okhttp 3 x okhttp okhttp3 CertificatePinner
  • 文件重命名不起作用

    我正在尝试为选定的文件名添加扩展名JFileChooser虽然我无法让它工作 这是代码 final JFileChooser fc new JFileChooser fc setFileSelectionMode JFileChooser
  • 从 JSP 调用 REST GET 服务

    我有一个动态设置应用程序页面标题的 JSP 但是 我希望能够调用基于系统用户获取用户详细信息的 REST 服务 我已经有了系统用户值 但需要调用后端服务从数据库中获取详细信息 这已经实现了 但我不知道如何设置 JSP 来执行此操作 我不想使
  • 在 Chrome 中的选择输入上使用框阴影

    我目前正在开发一个小型网站 并且我在网站上的各种元素上使用了盒子阴影效果 它似乎适用于所有应用它的元素 在 Chrome 和 Firefox 中 除了select and input 它在 Firefox 中适用于这些输入类型 但在 Chr
  • 在 Windows 中通过 pm2 执行 npm 脚本时出现问题

    我正在尝试跑步npm通过 pm2 使用自定义脚本ecosystem json as apps name Service script npm args run command 不幸的是我无法做到这一点 谁能帮助我解决这个问题 我得到如下所示
  • 更新默认的 nuget 包

    我了解如何更新解决方案中的包 但我的问题是如何更新默认包 IE 当我创建新的解决方案时 它已经是最新版本 而不必在每次启动新项目时都进行 管理解决方案包 和更新 例如 如果我创建一个新的 MVC4 项目 则正在安装 jQuery 1 7 1
  • 如何在android JellyBean 4.2.2中开发自定义状态栏

    我想开发定制的StatusBar 我知道我不是唯一有此要求的人 但还是想知道大家的意见 在 StackOverflow 上进行大量搜索后 我发现人们有 使用工具修改状态栏 但这不是我需要的 我有点在思考自己的Status发展方向 带有我自己
  • CSS 网格在 Safari 中不工作

    我试图弄清楚我正在做的事情是否有问题 或者 Safari MacOS 或 iOS 是否不支持 CSS 网格 尽管他们到处都说支持 CSS 网格 我尝试过这样的事情 ul list style type none text align cen
  • 连接数据表中两列的值

    连接数据表中两列的值两列使其成为数据表中的一列 我的数据表是 TagNumber LogNumber Combined 124 1 2 125 1 3 126 2 4 o p TagNumber 124 1 2 125 1 3 126 2
  • Bluez BLE 外设利用 ADV 数据宣传自定义特性

    是否有一个示例应用程序允许使用特定的 ADV 数据宣传自定义 UUID 和特征 Bluez 的文档较少 任何帮助表示赞赏 您拥有哪个版本的 BlueZ 对于较新版本的 BlueZ 例如 5 50 您可以从命令行使用 bluetoothctl
  • 在自己的类中使用依赖注入(而不是在组件中)?

    在组件中使用 DI 与注入效果很好 inject 或在代码隐藏中使用 inject 现在如果你想在普通类中使用 DI 如何工作呢 我在这里发现了完全相同的问题 Blazor 从 C 类调用 JavaScript https stackove