如何检查服务已在依赖注入容器中注册

前言

依赖关系注入(DI),是一种在类及其依赖项之间实现控制反转(IoC)的技术。在ASP.NET Core中,依赖关系注入是“一等公民”,被大量使用。

但是有时,我们仅仅只需要知道服务是否在依赖注入容器中已注册。

比如,不注册使用分布式缓存时,就不处理缓存逻辑。

但是,直接使用依赖注入,下列代码会报错:

private readonly IDistributedCache cache;public WeatherForecastController(IDistributedCache cache)
{this.cache = cache;
}

84cf8b537089dedecffa6de0fadbb8e1.png

有不有什么方法可以解决呢?

IServiceProvider 接口

可以使用IServiceProvider接口来解决:

public WeatherForecastController(IServiceProvider serviceProvider)
{useCache = serviceProvider.GetService(typeof(IDistributedCache)) != null;
}

当服务未注册时,GetService方法返回值为 null。

但是,这种方式会存在一定的性能问题。

因为这样做会实例化一个对象,而我们仅仅需要知道服务是否已注册。

IServiceProviderIsService 接口

面对这种需求,.NET 6 中提供了一个新接口IServiceProviderIsService可以解决:

app.MapGet("/", (IServiceProviderIsService serviceProviderIsService) =>
{return serviceProviderIsService.IsService(typeof(IDistributedCache));
});

此接口实例允许使用者查询服务是否可解析,而不会产生副作用(不必显式解析服务)。

当服务未注册时,IsService方法返回值为 false。

结论

今天,我们介绍了2种方法检查服务是否已在 DI 容器中注册。

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS9 Storyboard unwind segue反回传递事件时机详细步骤

当返回上一个界面且需要上一个界面做某事时,用unwind segue实现起来比delegate简单许多,甚至有时不适合用delegate来实现,那么我们就用unwind segue吧,而且像1->2->3这样的跳转,3视图可以通过unwind segue方便的返回到1、2任…

ios俩个APP之间跳转、传值

两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的。 1.首先设置第一个APP的url地址 2.接着设置第二个APP的url地址 3.需要跳转的时候 NSString *urlString [NSString stringWithFormat:"AppJumpSecond://%",textField.tex…

.Net Core手撸一个基于Token的权限认证

说明权限认证是确定用户身份的过程。可确定用户是否有访问资源的权力今天给大家分享一下类似JWT这种基于token的鉴权机制基于token的鉴权机制,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用,不需要去考虑用户在哪一台服务器…

Mybatis-Generator(MBG)教程与Idea的MBG插件

简介 Mybatis Generator(MBG),下面我们统称为MBG,是一个Mybatis和iBatis的代码生成器。他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。这样减少了项目新建时各种配置对象&#x…

Windows Server 2008 RemoteApp---发布应用程序

本章节一起来体验RemoteApp应用程序发布功能,本功能利用了微软应用程序虚拟化技术,打个比方,我这台电脑上并没有安装Excel2010,但我现再要用Excel2010该怎么办?难道去找Office2010的光盘来安装吗?不用这么麻…

.NET 中密封类的性能优势

.NET 中密封类的性能优势Intro最近看到一篇文章 Performance benefits of sealed class in .NET,觉得写得不错,翻译一下,分享给大家。目前看到的一些类库中其实很多并没有考虑使用密封类,如果你的类型是不希望被继承的&#xff0c…

jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定

事件绑定的方式有很多种。使用了jQuery那么原来那种绑定方式(elem.click function(){...})就不推荐了,原因? 最主要的一个原因是elem.click fn这种方式只能绑定一个事件处理,多次绑定的只会保留最后一次绑定的结果。 看一下jQue…

Windows 8系统平台上应用软件安装心得

1.ArcGIS 10.2安装 需要单独安装.NET 3.5,GIS软件自带的.NET系统不识别,点击360云盘地址进行下载(提取码为:1ed3)。(另外,Win8系统上安装.NET可以参考:http://blog.csdn.net/aijavaer/article/d…

Android视图绘制流程完全解析,带你一步步深入了解View(二)

转自:http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中,我带着大家一起剖析了一下LayoutInflater的工作原理,可以算是对View进行深入了解的第一步吧。那么本篇文章中,我们将继续对View进行深入探究&…

C# 线程问题之死锁

过多的锁定也会有麻烦。在死锁中,至少有两个线程被挂起,并等待对方解除锁定。由于两个线程都在等待对方,就出现了死锁,线程将无限等待下去。为了说明死锁,下面实例化 StateObject 类型的两个对象,并把它们传…

Matlab图形绘制

1.正余弦曲线 例如自变量从0到10,间隔为0.1的曲线代码如下: 正弦 t 0:.1:10; y sin(t); plot(t,y); 余弦 t 0:.1:10; y cos(t); plot(t,y); 正余弦图形显示如下:

Blazor University (5)组件 — 字面量、表达式和指令

原文链接:https://blazor-university.com/components/literals-expressions-and-directives/字面量、表达式和指令源代码[1]请注意,本节一般不涵盖 Razor 标记。它不会涵盖诸如条件输出、循环等内容。该主题在网络和书籍中的其他地方得到了广泛的介绍。使…

.NET6之MiniAPI(二十七):Metrics

应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库。prometheus-net的工作原理是,在应用内部埋点,通过prometheus采集数据,然后通过grafana把采…

回溯算法之布罗夫卫队(最大团问题)

1、问题 在原始部落中,由于食物缺乏,部落居民经常因为争夺猎物发生冲突,几乎每个居民都 有自己的仇敌。部落酋长为了组织一支保卫部落的卫队,希望从居民中选出最多的居民加入 卫队,并保证卫队中任何两个人都不是仇敌。假设已给定部落中居民间的仇敌关系图,编程 计算构建部落护…

microdot - 一个开源 .NET 微服务框架。

简介Microdot 是一个开源 .NET 框架,可满足轻松创建微服务的许多需求。它的一些主要特点•用于托管微服务的服务容器•服务间 RPC,便于基于接口的服务通信•服务之间的客户端透明响应缓存•日志记录和分布式跟踪支持•客户端负载均衡和服务发现•详细的健…

slider控件控制文本框字体大小

1.控件代码 <pre name"code" class"csharp"> <Slider x:Name"slider1" HorizontalAlignment"Left" Margin"0,261,0,0" VerticalAlignment"Top" Width"446" ValueChanged"Slid…

争时金融java_Java高并发编程基础之AQS

引言曾经有一道比较比较经典的面试题“你能够说说java的并发包下面有哪些常见的类&#xff1f;”大多数人应该都可以说出CountDownLatch、CyclicBarrier、Sempahore多线程并发三大利器。这三大利器都是通过AbstractQueuedSynchronizer抽象类(下面简写AQS)来实现的&#xff0c;所…

Xamarin效果第十三篇之弹窗PopupPage

在上一篇文章中使用Xamarin实现控制了一下祖传的PLC;基本的功能也就完事了,这不总觉得少点最基本的配置;那就趁着激情还在赶紧再去完善一下,不然激情已过就懒得去摸索了;来看看最终咱实现的视频效果:1、关于弹窗,直接使用开源的PopupPageInstall-Package Rg.Plugins.Popup -Ver…

C# 线程问题之争用条件

用多个线程编程并不容易。在启动访问相同数据的多个线程时&#xff0c;会间歇性地遇到难以发现的问题。如果使用任务、并行 LINQ 或 Parallel 类&#xff0c;也会遇到这些问题。为了避免这些问题&#xff0c;必须特别注意同步问题和多个线程可能发生的其他问题。下面探讨与线程…

尾调用优化 java_为什么JVM仍然不支持尾调用优化?

拉丁的传说也许您已经知道这一点&#xff0c;但是这个功能并不像听起来那么简单&#xff0c;因为Java语言实际上将堆栈跟踪暴露给程序员。考虑以下程序&#xff1a;public class Test {public static String f() {String s Math.random() > .5 ? f() : g();return s;}publ…