首页 > 解决方案 > 操作方法中的可选 [FromServices]?

问题描述

我有一个可选的范围 DI 服务 - 设置控制它是否打开。例如,这可能是我们在生产中不想要的性能跟踪开销,或者是我们希望能够在不重新发布的情况下关闭的第三方微服务。

使用构造函数注入,我可以检查参数是否为null,但是当我在操作方法中尝试相同的模式时:

public IActionResult ActionName([FromServices] IOptionalService optionalService)
{
    if(optionalService == null) {
        // handle optional service not being present
    }
    else {
        // do cool stuff with service
        optionalService.DoStuff();
    }
}

这会引发异常:

No service for type 'TheirNamespace.Whatever.IOptionalService' has been registered.

唯一的解决方法似乎是服务的虚拟实现:

-- startup.cs
if (string.IsNullOrEmpty(this.Configuration["UseOptionalService"]))
    services.AddMockService();
else
    services.AddActualService();

但这很痛苦,因为这些服务可能是第三方的(NuGet 包等)或者有很多方法可以实现。

这是实现可选 DI 服务的正确方法吗?有没有办法在操作方法中检查服务是否已注册(在启动时)?有没有更好的方法来打开和关闭注入服务?

标签: c#asp.net-core.net-coredependency-injection

解决方案


一种方法是注入IServiceProvider并使用该GetService方法(而不是GetRequiredService)。然后你可以做一个空检查,看看你是否得到了一个实例。


推荐阅读