.net core反射练习-简易版IOC容器实现
实现一个简易的IOC容器
先说一下简单思路,参考ServiceCollection,需要一个注册方法跟获取实例方法,同时支持构造函数注入。那么只需要一个地方存储注册接口跟该接口的继承类,以及根据类的构造函数去实例化一个对象出来。
创建一个.net core控制台程序,新建一个Container类。
创建一个静态字典存储类以及对应的type,这就是存储注册接口的地方
static Dictionary<string, Type> typeDic = new Dictionary<string, Type>();
然后就是实例化对象方法
/// <summary>
/// 根据类型实例化对象
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public T GetService<T>()
{
var type = typeof(T);
var targetType = typeDic[type.FullName]; return (T)Activator.CreateInstance(targetType);
}
很简单的一个方法,也有很明显的缺陷,不过现在已经可以根据注册的接口来实例化一个类。
最明显的一个问题是,没有根据构造函数来实例化类,下面来进行改进:
/// <summary>
/// 根据类型实例化对象
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public object CreateInstance(Type type)
{
object result = new object();
var targetType = typeDic[type.FullName];
var ctor = targetType.GetConstructors().OrderByDescending(c => c.GetParameters().Length).FirstOrDefault(); var paraList = new List<object>();
if (ctor != null)
{
foreach (var para in ctor.GetParameters())
{
var paraType = para.ParameterType;
var paraInstance = CreateInstance(paraType);
paraList.Add(paraInstance);
}
}
try
{
result = Activator.CreateInstance(targetType, paraList.ToArray());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} return result;
}
把容器实例化对象的方法独立出来,上面的方法做了两个改进:
- 默认选取最多参数的构造函数,这也是ServiceCollection的策略
- 递归构造函数里面的每个参数,为每个参数都进行实例化
再添加一个方法调用该方法给外部使用
/// <summary>
/// 获取实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T GetService<T>()
{
return (T)CreateInstance(typeof(T));
}
到这里就可以进行测试了,新建一个ISql接口,创建一个查询方法
namespace ISql
{
public interface ISqlHelpr
{
void Query();
}
}
分别创建两个类继承ISql
using System;
using ISql; namespace MySqlTest
{
public class MySqlHelpr : ISqlHelpr
{
public void Query()
{
Console.WriteLine("使用Mysql查询");
}
}
}
using System;
using ISql; namespace MySqlServerTest
{
public class SqlServerHelper : ISqlHelpr
{
public void Query()
{
Console.WriteLine("使用SqlServer查询");
}
}
}
返回控制台,新建一个容器,注册,获取实例,进行测试:


可以看到注册不同的类就实例化了对应的对象实例
下面再创建一个testClass类继承Itest接口,在MySqlHelper类中调用,展示构造函数注入
public interface Itest
{
public void consoleTest();
} public class testClass : Itest
{
public void consoleTest()
{
Console.WriteLine("调用consoleTest");
}
}
修改MySqlHelpr
public class MySqlHelpr : ISqlHelpr
{
private readonly Itest _testClass; public MySqlHelpr(Itest testClass)
{
_testClass = testClass;
} public void Query()
{
_testClass.consoleTest();
Console.WriteLine("使用Mysql查询");
}
}
回到控制台,注册testClass,就可以看到结果

done
.net core反射练习-简易版IOC容器实现的更多相关文章
- 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解
一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...
- DI 原理解析 并实现一个简易版 DI 容器
本文基于自身理解进行输出,目的在于交流学习,如有不对,还望各位看官指出. DI DI-Dependency Injection,即"依赖注入":对象之间依赖关系由容器在运行期决定, ...
- 2.自己搭建的一个简易的ioc容器
1.persondao类namespace MyselfIoC{ public class PersonDao { public override string ToStri ...
- DOTNET CORE源码分析之IOC容器结果获取内容补充
补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...
- 从0开始搭建一个IoC容器(C#版)
网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- Ioc容器与laravel服务容器初探
一.Ioc容器 某天,小J心血来潮,决定建造一艘星舰,这艘星舰要搭载"与众不同最时尚,开火肯定棒"的电磁炮.于是他写了一个星舰类: class ElectromagneticGun ...
- Spring.net(二)----初探IOC容器
我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口. IObjectFactory接口和 ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
随机推荐
- C#线性查找算法
前言 线性查找算法是一种简单的查找算法,用于在一个数组或列表中查找一个特定的元素.它从数组的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索完整个数组.线性查找的时间复杂度为O(n),其中n ...
- 5.6 Linux Vim撤销和恢复撤销快捷键
使用 Vim 编辑文件内容时,经常会有如下 2 种需求: 对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子. 将文件内容恢复之后,经过仔细考虑,又感觉还是刚 ...
- Linux Shell_read
介绍 从控制台输入 基本语法 read [选项] 参数 常用选项 |选项|功能| |-|-| |-p|指定读取值时的提示符| |-t|指定取值时等待的时间(秒),如果没有在指定时间输入,就不再等待了| ...
- visual studio当中动态库和静态库的联系
一.为什么要写这篇博客 公司需要调用MNN框架编译之后的动态库和静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有 ...
- 初识cuda一文通
cuda学习博客 本文为本人cuda学习过程中的记录和理解,多参考@谭升等大佬前辈的博客,以及NVIDIA官方文档.如有错误烦请指正,如有侵权请联系删除. 0. 并行计算与计算机架构 计算机架构是并行 ...
- 开源 - Ideal库 - 常用枚举扩展方法(二)
书接上回,今天继续和大家享一些关于枚举操作相关的常用扩展方法. 今天主要分享通过枚举值转换成枚举.枚举名称以及枚举描述相关实现. 我们首先修改一下上一篇定义用来测试的正常枚举,新增一个枚举项,代码如下 ...
- Java net.sf.jxls 生成模板 并导出excel
如果是 maven项目需要引入下面这个就可以 <dependency> <groupId>net.sf.jxls</groupId> <artifactId& ...
- 干货分享:开启PWM调光之门,一起来做呼吸灯
PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制.灯光调光.音频信号生成.加热控制等应用. 本文将以合宙低功耗4G模组经典型号--Air780E为例, ...
- node-npm发布包-package.json中bin的用法
前言 用过angular-cli,create-react-app这些脚手架的朋友们,不知道你们有没有好奇过,为什么安装这些脚手架后,可以使用类似ng generate之类的命令.小弟研究了以下,原来 ...
- vue 子组件data属性为啥必须是一个函数
其实就是一个原因,实例化出来的根组件只有一个,你可以将它写成对象,或者是返回一个对象的函数.但是子组件不够健壮,容易在内存的地址中互相影响,就像我们常用的深浅拷贝所能解决的那样.所以为了防止意外的发生 ...