实现一个简易的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容器实现的更多相关文章

  1. 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解

    一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...

  2. DI 原理解析 并实现一个简易版 DI 容器

    本文基于自身理解进行输出,目的在于交流学习,如有不对,还望各位看官指出. DI DI-Dependency Injection,即"依赖注入":对象之间依赖关系由容器在运行期决定, ...

  3. 2.自己搭建的一个简易的ioc容器

    1.persondao类namespace MyselfIoC{    public class PersonDao    {        public override string ToStri ...

  4. DOTNET CORE源码分析之IOC容器结果获取内容补充

    补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...

  5. 从0开始搭建一个IoC容器(C#版)

    网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...

  6. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  7. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  8. Ioc容器与laravel服务容器初探

    一.Ioc容器 某天,小J心血来潮,决定建造一艘星舰,这艘星舰要搭载"与众不同最时尚,开火肯定棒"的电磁炮.于是他写了一个星舰类: class ElectromagneticGun ...

  9. Spring.net(二)----初探IOC容器

    我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和 ...

  10. IOC容器特性注入第一篇:程序集反射查找

    学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...

随机推荐

  1. 在浏览器输入 URL 回车之后发生了什么(流程图,超详细版)

    前言 这个问题已经是老生常谈了,更是经常被作为面试的压轴题出现,网上也有很多文章,但最近闲的无聊,然后就自己做了一篇笔记,感觉比之前理解更透彻了. 这篇笔记是我这两天看了数十篇文章总结出来的,所以相对 ...

  2. Games101 作业8 质点弹簧系统

    目录 1 前言 2 基础数据结构 3 欧拉 4 Verlet Integration 4.1 Constraints 1 前言 质点弹簧系统的模拟仿真,其实非常简单,核心就是牛顿第二定律 \(F = ...

  3. centos 的yum源设置

    转载请注明出处: 在CentOS系统中,yum是自带的.yum(Yellowdog Updater, Modified)是一款在CentOS及其他基于Red Hat的Linux发行版中广泛使用的包管理 ...

  4. npm安装html2canvas依赖报错 npm ERR! Unexpected token < in JSON at position 0 while parsing near '<!DOCTYPE html> npm ERR! <htm...'

    今天安装某个依赖时发现npm ERR! 可我是正常操作啊,也没有升级啥的,咋就安装不了了? npm install --save html2canvas 报错信息如下: npm ERR! Unexpe ...

  5. P4229 某位歌姬的故事

    P4229 某位歌姬的故事 处理复杂点的 dp 题. 思路 先考虑 \(n\) 比较小的情况,把每个询问放到线段上,发现每个格子只能满足覆盖最小的限制,于是考虑将询问有效区间排序考虑. 设 \(f[i ...

  6. npm 发包命令

    npm publish 此命令发布latest版本 npm publish --tag=alpha 发布alpha版本(测试版本)       紧急回退包方案: 分享一下bnpm给的处理方案 如果因为 ...

  7. tsconfig配置详解

    { "compilerOptions": { /* Basic Options */ "target": "es5" /* target用于 ...

  8. Apache 门户项目组介绍

    本文将快速浏览 Apache 门户项目组的所有项目,并着重介绍门户项目组中的核心项目-Jetspeed-2. 0 评论: 廖 健, 首席实施顾问 2006 年 11 月 02 日 内容 引言 JEE作 ...

  9. Spring源码学习 ------ IoC——AOP

    一直想抽空把Spring源码拿来读读,但真正去做这件事的时候发现不简单,Spring发展这么多年,它的规模已不是一个一般的开源框架所能比的,它的主要架构和流程不是非常清晰,很难抓到要害,但有一点可以肯 ...

  10. Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...