Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 操作方法中的可选[FromServices]?_C#_Asp.net Core_.net Core_Dependency Injection - Fatal编程技术网

C# 操作方法中的可选[FromServices]?

C# 操作方法中的可选[FromServices]?,c#,asp.net-core,.net-core,dependency-injection,C#,Asp.net Core,.net Core,Dependency Injection,我有一个作用域DI服务,它是可选的-设置控制它是否打开。例如,这可能是我们不希望在生产中使用的性能跟踪开销,或者是我们希望能够在不重新发布的情况下关闭的第三方微服务 使用构造函数注入,我只需检查参数是否为null,但当我在操作方法中尝试相同的模式时: public IActionResult ActionName([FromServices]iooptionalservice optionalService) { if(optionalService==null){ //处理不存在的可选服务 }

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

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

public IActionResult ActionName([FromServices]iooptionalservice optionalService)
{
if(optionalService==null){
//处理不存在的可选服务
}
否则{
//用服务做一些很酷的事情
optionalService.DoStuff();
}
}
这会引发一个异常:

尚未注册类型为“TheirNamespace.Whatever.IOOptionalService”的服务。

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

--startup.cs
if(string.IsNullOrEmpty(this.Configuration[“UseOptionalService”]))
AddMockService();
其他的
services.AddActualService();
但这是一个难题,因为这些服务可能是第三方的(NuGet软件包等),或者有很多方法要实现


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

一种方法是注入
IServiceProvider
并使用
GetService
方法(而不是
GetRequiredService
)。然后,您可以进行空检查以查看是否获得实例