.net中反射与IOC容器实现
反射还是很有用的,比如IOC容器基本上都是通过反射实现的。
IOC是什么
IOC:Inversion of Control 控制反转
是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。
其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。
IoC体现了好莱坞原则,即“不要打电话过来,我们会打给你”
设计模式六大原则
单一职责原则:一个类只负责一个功能领域中的相应职责。
开闭原则:一个软件实体应当对扩展开放,对修改关闭。
里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象。
接口隔离原则:使用多个专门的接口,而不使用单一的总接口。
迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
依赖倒置原则(DIP):Dependence Inversion Principle
对应DIP原则,即:高层模块不应该依赖低层模块,两者都应该依赖其抽象;
抽象不应该依赖细节;细节应该依赖抽象。
另外,我们可能经常听人提到DI。
DI:Dependence Injection 依赖注入
将对象依赖的其他对象,通过注入的方式进行初始化,主要有三种方式:构造器注入、setter注入、接口注入
ICO容器

构造容器的思路:提取第三方,kv容器,注册,获取实例。
反射
反射的概念就不补充了,各位百度。
反射通过assemblyName的写法(不是我构造简单容器的用法,只是为了加深理解)
/// <summary>
/// 创建对象实例
/// </summary>
/// <typeparam name="T">要创建对象的类型</typeparam>
/// <param name="assemblyName">类型所在程序集名称</param>
/// <param name="nameSpace">类型所在命名空间</param>
/// <param name="className">类型名</param>
/// <returns></returns>
public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
{
try
{
string fullName = nameSpace + "." + className;//命名空间.类型名
//此为第一种写法
object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
return (T)ect;//类型转换并返回
//下面是第二种写法
//string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
//Type o = Type.GetType(path);//加载类型
//object obj = Activator.CreateInstance(o, true);//根据类型创建实例
//return (T)obj;//类型转换并返回
}
catch
{
//发生异常,返回类型的默认值
return default(T);
}
}
简单容器代码
容器类
public class MyIoc
{
/// <summary>
/// 声明容器
/// </summary>
private static Dictionary<Type, Type> container = new Dictionary<Type, Type>(); /// <summary>
/// 容器注册方法(将接口类型,与接口实现类型 放入容器中)
/// </summary>
/// <typeparam name="TInterface"></typeparam>
/// <typeparam name="TImplement"></typeparam>
public static void Resgister<TInterface,TImplement>()
{
container.Add(typeof(TInterface), typeof(TImplement));
} /// <summary>
/// 根据容器中value的类型 ,通过反射创建实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="typeInterface"></param>
/// <returns></returns>
public static T GetInstance<T>(Type typeInterface)
{ var typeImplement = container.Keys.Contains(typeInterface) ? container[typeInterface] : null;
if (typeImplement == null)
{
throw new Exception("未绑定相关类型");
}
var constructor = typeImplement.GetConstructors()[]; return (T)constructor.Invoke(null);
}
}
映射关系及获取实例
public class Mapper
{
public static void Mapping()
{
//在此处调用容器维护映射关系
MyIoc.Resgister<IStudent, Student>(); //....
//....
//....
} /// <summary>
/// 获取接口类型对应的实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T GetInstance<T>()
{
return MyIoc.GetInstance<T>(typeof(T));
}
}
其他的非核心代码就不往上贴了。可以从gitHub获取
源码链接:https://github.com/li-shaoke/AppMyIOC
.net中反射与IOC容器实现的更多相关文章
- PHP 在Swoole中使用双IoC容器实现无污染的依赖注入
简介: 容器(container)技术(可以理解为全局的工厂方法), 已经是现代项目的标配. 基于容器, 可以进一步实现控制反转, 依赖注入. Laravel 的巨大成功就是构建在它非常强大的IoC容 ...
- Eclipse中使用Spring IOC容器的具体方法
1.通过IOC容器创建对象,并为属性赋值 在IOC容器本身对象创建时(xml文件加载时),会将配置文件中配置好的bean先创建出来,按照xml文件中配置的先后顺序创建 <bean id=&quo ...
- Spring中Bean获取IOC容器服务的方法
Spring 依赖注入可以让所有的Bean对其IOC容器的存在是没有意识的,甚至可以将容器换成其它的.但实际开发中如果某个Bean对象要用到Spring 容器本身的功能资源,需要意识到IOC容器的存在 ...
- [PHP] 项目实践中使用的IOC容器思想
1.容器的意思就是一个全局变量,里面存了很多对象,如果要用到某个对象就从里面取,前提就是要先把对象放进去2.控制反转就是把自己的控制权交给别人3.这两个结合就是,把自己的控制权交给别人并且创建的对象放 ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...
- Spring核心原理之 IoC容器中那些鲜为人知的细节(3)
本文节选自<Spring 5核心原理> Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.使用FactoryBean产生或者修饰Bean对象的生成. ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
随机推荐
- 【sping揭秘】3、Spring容器中bean默认是保持一个实例
Spring容器中bean默认是保持一个实例 这里做一个测试,基础代码 package cn.cutter.start.provider; import org.springframework.con ...
- 关于Mybatis中Mapper是使用XML还是注解的一些思考
XML 据说可以灵活的进行注解,但是修改以后还是要重新发布程序.当然,你可以说,在Tomcat中改了,然后热加载了,不就可以了.可是一般情况下都是几台,十几台服务器.都是用发布系统,持续集成的方式部署 ...
- Odoo中使用的数据模型
Odoo中使用的部分表如下, res_users 用户 res_groups 用户组(角色) res_lang 语言 res_partner 供应商/客户/联系人 res_font 字体 res_co ...
- vue插件ele使用小坑
1.ele-table组件中selection如何默认选中 使用官网提供的api-->>Table Methods中的toggleRowSelection,关于这个api基本介绍就不说了. ...
- PHP:判断客户端是否使用代理服务器及其匿名级别
要判断客户端是否使用代理服务器,可以从客户端所发送的环境变量信息来判断. 具体来说,就是看HTTP_VIA字段,如果这个字段设置了,说明客户端使用了代理服务器. 匿名级别可以参考下表来判断. 给出一个 ...
- vue 运行npm run dev报错
npm run dev运行时报错,原因有很多. 一般用下面这种方法都能解决的. 最简单粗暴的方法: 1.删除依赖包node_modules 2.然后重新npm install就行了 (如果这步报错了, ...
- 图片按日期分类和查看程序(WPF开发)(附源码)
手机方便了我们的生活,可以随时随地拍摄.越来越多的图片堆砌在电脑里.看到杂乱无章的图片,实在感到头痛.手动整理太复杂.基于此,我写了一个小程序,可以将图片按日期整理和查看.按日期查看图片,回忆过去的点 ...
- 遍历 JSON JavaScript 对象树中的所有节点
我想要遍历 JSON 对象树中,但为何找不到任何一间图书馆.这似乎是不难,但感觉就像重新发明轮子. 在 XML 中有很多教程演示如何遍历 XML DOM 树:( 解决方法 1: 如果你认为 jQuer ...
- 第三方登录:新浪微博登录(OAuth2.0)
在<Github第三方登录--通用化的第三方登陆实现>中我们实现了一个通用化的第三方登录框架,其中包括OAUth的基本流程以及最简单的用户注册.但是不同的第三方登录因为其细节不同还是有很多 ...
- Java NIO系列教程(三) Buffer
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...