.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容 ...
随机推荐
- linux 基础(8)例行任务
我们的 linux 系统,有时会自动进行线上更新,会定时升级locate用到的数据库.用户也会"在每天0点备份数据"或者"每天8点分析登录文件",管理这些例行任 ...
- Robust Loop Closure by Textual Cues in Challenging Environments
arxiv | 南洋理工大学开源 基于文本线索实现复杂环境中的鲁棒闭环检测 [Robust Loop Closure by Textual Cues in Challenging Environmen ...
- C++学习——访问修饰符
一.类是什么 类是C++当中的一个集合,定义了"属性",通过类可以实例化对象,此时对象的属性就囊括在这个类当中.比如: class student { public: string ...
- Linux /dev/loop0文件详解
loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件. 在使用之前,一个 loop 设备必须要 ...
- 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现八
一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...
- 一个基于.Net Core 开源的物联网基础平台
在智慧工厂领域,智慧城市领域,都需要对设备进行监控.比如工厂需要对周围环境温度.湿度.气压.电压,灯的开关进行监控.这时候就需要物联网平台来进行管理. 在智慧工厂领域,宝马集团通过英伟达的Omnive ...
- Nuxt.js 应用中的 webpack:compile 事件钩子
title: Nuxt.js 应用中的 webpack:compile 事件钩子 date: 2024/11/22 updated: 2024/11/22 author: cmdragon excer ...
- 零基础学习人工智能—Python—Pytorch学习(十一)
前言 本文主要介绍tensorboard的使用. tensorboard是一个可视化的,支持人工智能学习的一个工具. tensorboard的官方地址:https://www.tensorflow.o ...
- Intel Pin初探
1.在/home/hf/Desktop/pin/pin-3.30-98830-g1d7b601b3-gcc-linux/source/tools/ManualExamples/目录下写自己的pinto ...
- 注册美区 Apple ID 账号!都2020年了,你还没有一个自己的海外苹果ID?
写在前面: 小伙伴们学腻了技术,不防今天来点大家都感兴趣的海外苹果 Apple ID 吧! 今天就教大家怎么注册美区 Apple ID,这个方法也是目前注册苹果美区 Apple ID 最快最简单的 ...