.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容 ...
随机推荐
- SSIS ODBC方式连接mysql数据库
系统环境:WIN 10 64位 1.安装Mysql odbc connector 插件 文章说明链接: https://www.cnblogs.com/santiagoMunez/p/4780301. ...
- Next.js 从零入门到实战 3:2024最新完整教程 | 包含SSR、API路由和性能优化
CSS样式学习 上一篇文章讲到如何创建一个脚手架程序,目前我们已经有了一个nextjs的基本框架,因此我们可以在这个基础上进行改造.打开我们项目中的page.tsx页面,这里是程序的主页面,也就是我们 ...
- CF#795 D - Max GEQ Sum O(n)做法
D - Max GEQ Sum input 3 4 -1 1 -1 2 5 -1 2 -3 2 -1 3 2 3 -1 output YES YES NO 题目大意:给你一个数组a,让你任意一个字段均 ...
- java通过SSE实现消息推送
一.什么是SSE 严格地说,HTTP 协议无法做到服务器主动推送信息.但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming). 也就是说,发送的不是一次性的数据包, ...
- 5.9 Linux Vim批量注释和自定义注释
使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符#再退回命令模式,非常麻烦. 连续行的注释其实可以用替换命令来完成.换句话说,在指定范 ...
- 两个新出的 JavaScript 运算符
在 ECMAScript 2021(ES12)中,JavaScript 引入了新的逻辑赋值操作符 &&= 和 ??=.这些操作符将逻辑运算符与赋值运算符相结合,提供了更加简洁.直观的赋 ...
- 鸿蒙NEXT开发案例:简体繁体转换器
[引言] 简体繁体转换器是一个实用的小工具,它可以帮助用户轻松地在简体中文和繁体中文之间进行转换.对于需要频繁处理两岸三地文档的用户来说,这样的工具无疑是提高工作效率的好帮手.本案例将展示如何利用鸿蒙 ...
- 2020-2024 Rider安装+激活
一.下载 1. rider各版本官方下载入口 rider官网下载地址 2. 选择左边,然后点击[20xx.x.x-Windows(exe)] PS: 如需下载特定版本,可以往下拉,都是选择[202x. ...
- webpack中引用jQuery的四种方式
import webpack中是根据一个入口文件开始收集依赖. import $ from 'jquery' 但是一个项目中通常有很多个地方都用到了jQuery,每个模块都要这样的一行代码 那么如何解 ...
- 『玩转Streamlit』--布局与容器组件
在Streamlit中,布局类组件扮演着至关重要的角色. 它们不仅决定了应用程序的视觉呈现和用户体验,也极大地增强了页面内容的组织性和可读性. 通过这些组件,开发者可以灵活地划分页面空间,创建出清晰. ...