具有不可注入参数的服务和通用类的 Blazor 构造函数注入 [重复]

Posted

技术标签:

【中文标题】具有不可注入参数的服务和通用类的 Blazor 构造函数注入 [重复]【英文标题】:Blazor constructor injection for service and general class with non-injectable parameters [duplicate] 【发布时间】:2021-10-13 09:38:42 【问题描述】:

我想将IServiceProvider(可能还有其他一些服务)注入到一个服务和/或一个其构造函数采用其他不可注入参数的自定义类中。

以下是我的服务/类的示例:

public class MyService 
    IServiceProvider _sProvider;
    /*possibly other injectable services*/
    public MyService(object someCustomStuff, IServiceProvider sProvider) 
        // --- keep reference for later use in methods...
        _sProvider = sProvider;
    


请注意,如果我能够访问IServiceProvider,然后我可以使用_sProvider.GetService(typeof(MyRequiredService)) 即时检索我需要的任何服务,因此我不必在此处注入其他服务。

不过,我的要求是在这里以某种方式使用注入。

对于在Startup.ConfigureServices 中注册的服务。默认services.AddSingleton<MyService>() 会引发错误,因为注入无法将第一个someCustomStuff 参数作为服务检索(我不希望它成为一个!)。我实际上尝试了使用构造函数显式注册服务的替代方法:

services.AddSingleton(new MyService(myCustomStuff, _?IServiceProvider?_));

但我不知道如何在Startup.ConfigureServices 中显式访问IServiceProvider...

这自然会引出一个关于非组件类和Startup.ConfigureServices以外的其他地方的构造函数注入的更普遍的问题:

    是否有可能(如果可以的话)使用具有注入服务和不可注入参数的混合构造函数获得依赖注入?

    是否有可能(如果是的话,如何)在我没有显式访问要注入的服务的代码中通过构造函数使用依赖注入(如果我这样做,例如在组件中,这是微不足道的,因为我可以很容易向组件注入所需的服务,然后显式地将它们转发给构造函数...)

【问题讨论】:

是的,我只是在阅读它...我会发布答案!谢谢;) 【参考方案1】:

对于第 1 部分,答案是使用提供的委托方法:

services.AddSingleton<MyService>(provider => new MyService(myCustomStuff, provider));

要在构造函数中传递其他注入的依赖项,请从提供者处获取它们(当然要确保服务已经注册):

services.AddSingleton<MyService>(
    provider => 
        new MyService(myCustomStuff, provider.GetService<MyOtherService>())
);

感谢this post

【讨论】:

以上是关于具有不可注入参数的服务和通用类的 Blazor 构造函数注入 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Blazor 类中注入服务(AuthenticationStateProvider)

Blazor IStringLocalizer 向服务注入

如何将服务注入 Blazor?

如何在 Azure DevOps 上为发布服务器项目而不是客户端的 Blazor WebAssembly 托管应用程序创建构建管道?

Blazor、对象生命周期和依赖注入

如何制作一个可以接收不同对象列表作为参数的通用 Blazor 组件?