【问题标题】:Blazor DI – How to access a service in a class that is not a Blazor component?Blazor DI – 如何访问不是 Blazor 组件的类中的服务?
【发布时间】:2020-06-23 06:25:14
【问题描述】:

我有一个不是 Blazor 组件的后台类,我想使用内置记录器 (ILogger) 服务。

我不能在属性上使用“[Inject]”(因为它不是组件),也不能使用支持的构造函数注入,因为构造函数还有其他参数(即不仅仅是单个 ILogger 参数)。我一直在寻找可以在构造函数中使用但找不到任何东西的“Application.GetService”(类似于我使用的其他 IOC 实现)。

有什么想法吗?

【问题讨论】:

  • I can’t use the supported constructor injection because the constructor has other parameters - 这并不意味着您不能在必要时再添加一个。
  • @RogerWolf - 抱歉,我不清楚 - 我的班级实现了一项服务,我希望在 Startup 中使用 AddSingleton 来管理该服务。 DI 上的文档声明如下:“必须存在一个构造函数,其参数都可以由 DI 实现。如果指定了默认值,则允许 DI 未涵盖的其他参数。”我需要指定那些额外的参数,我不能依赖默认值。

标签: dependency-injection blazor


【解决方案1】:

看起来您需要为您的服务注册默认值。 您可以在Startup.csConfigureServices 中执行此操作,例如services.AddTransient(<your service>)

如果您希望能够在运行时获得服务,您可以使用 .GetService<>() 方法注入 IServiceProvider,或者如果您希望能够在没有 DI 的情况下调用它,您可以创建一个单例在您的应用启动时注册。单身人士将为服务提供者提供一个属性,然后您可以从任何您想要的服务中调用该属性(尽管我建议不要这样做 - 而是使用 DI)

还可以通过适配器将 MS DI 与其他 DI 容器结合起来。您似乎已经为您的服务提供了 DI 解决方案,如果是这样的话,这可能是最好的方法。在您的 CreateHostBuilder() 设置方法中,以 .UseServiceProviderFactory() 开头以使用不同的容器。不过,您需要为您的容器找到正确的适配器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2020-03-25
    • 1970-01-01
    • 2020-08-16
    • 2021-05-25
    • 2020-05-05
    • 2020-03-19
    相关资源
    最近更新 更多