C#实现乞丐版IOC容器

一、前言

netcore中的容器非常好用,今天我们自己来简单实现一个。

实现容器的核心接口有两个:IServiceCollection、IServiceProvider。其中IServiceCollection定义容器集合,IServiceProvider提供容器中对象的访问。话不多说,直接编码。

二、IServiceCollection

首先我们得定义IServiceCollection接口,这个接口主要用以帮我们实现自定义集合,所以我们选择继承IList。代码如下:

细心你肯定发现了IList中ServiceDescriptor的定义了,这个类其实就是一个服务的描述类,我们F12进去看一下是怎么定义的。代码如下:

真的就是非常简单,ServiceType和ImplServiceType分别定义接口和实现类,LifeTime是一个枚举,用来定义这个类型的生命周期。代码如下:

现在我们已经定义好了IServiceCollection,下面就定义它的实现类:ServiceCollection,这个类就是具体的维护一个ServiceDescriptor集合。代码如下:

你也看到了,这个类,真的太简单了,就是用来将服务添加到集合_descriptors中了。唉,简单到不想多说了。写到这里,乞丐版容器其实已经实现了,我们来弄个控制台试下。代码如下:

细心的你可能会问,工作中使用容器的时候好像都是用的AddSingleton、AddScope的方法注入的,其实这些都是对IServiceCollection的扩展方法。那我们也来弄一个吧,先定义一个扩展类:ServiceCollectionExtensions。代码如下:

写好这些扩展方法后,我们再来改下控制台中的代码,就和你实际工作中长一样了。代码如下:

三、IServiceProvider

这时你可能又会问,服务我已经注册到容器了,我要怎么使用呢?这个时候我们就要用到开头所说的IServiceProvider,这个接口定义访问容器中的服务,记住继承下IDispose,用来释放资源。代码如下:

定义好接口以后,我们就要弄一个实现类,即ServiceProvider,这个类中主要实现GetService方法,用来提供服务对象实例。代码如下:

ServiceProvider构造方法需要IServiceCollection对象,不然它都不知道提供哪个容器的服务对象。这个类中维护了一个_objects字典,用来管理单例(Singleton)、范围(Scoped)对象。GetService方法也非常的简单,先到容器对象中找下已注册的服务,如果找不到,直接返回null。如果找到,则根据这个注册类型的生命周期返回对象:瞬时对象的话每次都创建新对象,单例和范围对象的话先到_objects查询,如果有的话直接返回,没有的话重新创建一个,放回_objects后再返回。有了ServiceProvider类后,我们就可以在控制台中提供注册的服务对象了。代码如下:

上面的代码中,我们new了一个ServiceProvider对象,并把ServiceCollection对象传给了它,意思是我把容器交给你,访问服务对象的事就拜托你了。然后我们通过GetService得到几个单例和瞬时对象,我们运行下看下,他们hashcode是不是和我们预期的一样。代码如下:

我们发现得到的单例对象hashcode值都一样,瞬时对象每次都不一样,说明我们这个IOC基本功能已经实现了,真了不起。上面的new ServiceProvider我们也可以改成扩展方法。代码如下:

然后我们测试代码中替换一下。代码如下:

细心的你肯定又发现不对,你这一直没讲Scope呀。其实Scope和Singleton是一样的,Scope只是一定范围的单例。你只要在范围内每次new一个ServiceProvider就行了。代码如下:

四、总结

至此,我们乞丐版的IOC容器就完成了,能力有限,只是实现最简单的功能,很多校验都没有写。还是建议大家直接看微软的源码,那个里面写的比较高端,我这只是毛毛雨,如果能帮到你一点点,我就会很开心了,哈哈。

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

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

相关文章

leetcode hot100.2. 两数相加(详解)

一:题目 二:上码 // /** // * Definition for singly-linked list. // * public class ListNode { // * int val; // * ListNode next; // * ListNode() {} // * ListNode(int val) { this.val val; } // * ListNode(int val, ListNode next) { t…

COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)

中国开源年会 COSCon20,本周末你准备好了吗业界最具影响力的开源年度盛会2020中国开源年会 (COSCon20) 将于 10月24-25日由开源社举办。本次大会较往年出现了许多新变化,您可能有许多问题,为了让大家尽快参与其中,小编在这里为大家…

leetcode647. 回文子串(动态规划)

一:题目 二:上码 class Solution {/**思路:1.确定dp数组dp[i][j]:表示的是区间范围内[i,j]的字符串是否是回文串 2.确定dp数组递推公式1>:如果s[i] ! s[j] 那就是false2>:如果s[i] s[j] 如果 i - j < 1 那么的话 dp[i][j] 就为true如果 i - j > 1 的话 那就要看…

搬砖的八种境界

这一点文字&#xff0c;纯属有感而发。世上的道路千万条&#xff0c;搬砖的队伍更是前仆后继&#xff0c;延绵不绝。我总结有八种境界&#xff0c;请各位看官对号入座&#xff0c;不要客气。不知道怎么搬砖。职业早期&#xff0c;无可厚非。但如果长期处于这个阶段&#xff0c;…

芯片项目谁支持谁负责 重大损失将予以通报

随着全国掀起半导体热&#xff0c;全国各地都在大力投资&#xff0c;其中不乏浑水摸鱼的存在&#xff0c;在江苏、四川、湖北、贵州已经有多个半导体大项目先后停摆。在南京&#xff0c;号称投资30亿美元的德科码已经烂尾。在淮安&#xff0c;规划总投资450亿元的德淮半导体烂尾…

leetcode5. 最长回文子串

一:题目 二:上码 class Solution {/**思路:1.确定dp数组2.确定dp数组的递推公式s[i] ! s[j] 那么dp[i][j] 肯定为falses[i] s[j] 那么的话 i - j < 1 为true ans max(ans,i-j 1);i - j > 1的话 那么dp[i1][j-1] true的话那么dp[i][j] trueans max(ans,i-j1);3.确定…

leetcode11. 盛最多水的容器

一:题目 二:上码 // class Solution { // public int maxArea(int[] height) { // int len height.length; // int ans 0;// for (int i 0; i < len; i) { // for (int j len - 1; j > i; j--) {// int x …

技术债! 怎样简洁高效的实现多个 Enum 自由转换

一&#xff1a;背景 1. 讲故事前段时间和同事负责一个项目的两个业务模块&#xff0c;可能大家缺少沟通&#xff0c;导致本该定义一个 Enum 的地方结果我俩各自定义了一个&#xff0c;导致后面这两个 Enum 进行对接就烦了&#xff0c;为了方便理解&#xff0c;也不想让大家看这…

分享套接字数据包序列化与反序列化方法

分享套接字数据包序列化与反序列化方法“简单说一下&#xff0c;本文不涉及Socket的连接、数据接收&#xff0c;只是对数据包(byte[])的序列化和反序列化方法的封装介绍。本文目录本文背景一般操作本文操作总结1.本文背景经常做C/S&#xff0c;客户端与服务端通信基本是TCP/UDP…

leetcode22. 括号生成(回溯)

一:题目 二:上码 class Solution {public List<String> generateParenthesis(int n) {List<String> ans new ArrayList<>();def(ans,new StringBuilder(),n,n);return ans;}/**left:左边还可以用的括号数量right:右边还可以用的括号数量*/public void def(…

leetcode31. 下一个排列

一:题目 二:上码 class Solution {/**规律: 从后往前找到那个比其小的数进行交换 然后 在小的数后面的数都进行排序12345 --> 1235412354 --> 12453 --> 12435*/public void nextPermutation(int[] nums) {int len nums.length;for (int i len - 1; i > 0; i--)…

回顾 | 进击吧! Blazor !第三期 信息交互

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

回顾 | 进击吧! Blazor !第四期 组件开发

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

面试官:请问一条select的语句的执行会发生什么?

文章目录前言:一:执行一条select的概览二:具体流程1:连接器(1):步骤(2):浅浅来一下细节2:查询缓存(1):mysql5.8之前的幸福时光(2):mysql5.8之后的悲惨结果3:解析器(解析sql)(1):词法解析(2):语法解析4.执行sql(1):预处理阶段(2):优化阶段(3):执行器(1):概述(2):三种方式a:主键索…

跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

前言MVC过滤器在之前Asp.Net的时候就已经广泛使用啦&#xff0c;不管是面试还是工作&#xff0c;总有一个考点或是需求涉及到&#xff0c;可以毫不疑问的说&#xff0c;这个技术点是非常重要的&#xff1b; 在之前参与的面试中&#xff0c;得知很多小伙伴只知道有一两个过滤器&…

彭博社:中企游说政府否决英伟达收购Arm

9月14日&#xff0c;英伟达与软银宣布达成最终协议&#xff0c;英伟达将以400亿美元的价格从软银收购ARM。在台积电明确于9月15日后不再向HW的ARM提供代工服务之后&#xff0c;一家美国公司又将ARM收入囊中&#xff0c;这使国产ARM CPU在设计和制造环节都存在巨大风险&#xff…

Explain各个字段的含义

文章目录[TOC]1:expanin的结果示例2:各个字段的含义(1):id(2):select_type(3):table(4):type&#xff08;重要 我们利用索引查找出来的记录显示&#xff09;(5): possible_keys(6):key(7):key_len(8):ref(8):rows(重要)(9):extra1:expanin的结果示例 mysql> explain select…

asp.net core监控—引入Prometheus(三)

上一篇博文中说到Prometheus有四种指标类型&#xff1a;Counter&#xff08;计数器&#xff09;、Gauge&#xff08;仪表盘&#xff09;、Histogram&#xff08;直方图&#xff09;、Summary&#xff08;摘要&#xff09;&#xff0c;并且我们做了一个Counter的Demo&#xff0c…

秋招日常(一天三封感谢信)

就离谱 上午收到两封 搞得复习贼没心态 下午打完球回来一看手机又收到一封 这个有点伤 自己测评完 笔试 笔试完 约面 技术面过了 hr又面 面完说等消息 我寻思hr面能有啥可挂的 就离谱 一想到自己经过那么多轮 还是挂了 就难受 什么鬼 求求了 给个offer吧 要不我快成了天天向下的…