c# - 操作方法中的可选 [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 服务的正确方法吗?有没有办法在操作方法中检查服务是否已注册(在启动时)?有没有更好的方法来打开和关闭注入服务?
解决方案
一种方法是注入IServiceProvider
并使用该GetService
方法(而不是GetRequiredService
)。然后你可以做一个空检查,看看你是否得到了一个实例。
推荐阅读
- java - 缺少包“sun.java2d.cmm” - 有人知道我应该从哪里得到它吗?
- vba - Powerpoint VBA 中的发送键
- r - 如何在R中为ggplot中的矩形自动查找序列的开始和结束
- android - Firebase 云消息传递无法在后台运行
- video - 为什么 ffmpeg 将 FLV 转换为 h264 时会删除 SEI 消息?
- linux - lsyncd - 事件队列中的溢出 - 解决方案是调整 fs.inotify.max_queued_events
- sql - SQL将空日期与另一个日期进行比较
- java - while循环中的数学运算
- android - FireStore 数据库集从不调用 OnSuccessListener 或 OnFailureListener
- python-3.x - 如何在 Flask 中通过 gzip 解压 FileStorage 对象