通过反射实现IOC功能
这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac、Ninject、Utity包括.NET自带的MEF等。由于今天周六,女朋友去加班了(也是一枚标准的程序媛,做java开发),闲来没事,自己就想着根据反射可以自己写一个简易的IOC组件。IOC组件说白了就是根据反射实例化对应的接口。废话不多说,开始说说我的解决方案。
1、项目结构图:
- IOCTest为web MVC项目。
- Common 通过配置文件实例化对应的接口
- IBLL定义的接口
- BLL实现接口
2、引用
- IOCTest项目引用IBLL、Common项目,不能引用BLL项目,这样就使IOCTest项目只依赖接口。
- BLL项目引用IBLL并实现接口
- 修改BLL项目dll生成路径,使其DLL生成到IOCTest项目的Bin目录下,如下图设置
3、下面我们来看具体的实现
(1)在IBLL层的IHelloWord.cs类中我们定义一个接口,代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace IBLL {public interface IHelloWord{string SayHello(string Name);} }
(2)BLL层实现接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using IBLL;namespace BLL {public class HelloWord:IHelloWord{#region IHelloWord 成员public string SayHello(string Name){return "Hello_"+Name;}#endregion}}
(3)在IOCTest 项目的根目录Web.config下做如下配置(把HelloWord和IHelloWord对应起来):
<appSettings><add key="IBLL.IHelloWord" value="BLL,BLL.HelloWord"/></appSettings>
说明: key值为接口的全称(命名空间+类名),value值为实现接口的类,两部分组成,逗号前面为生成的dll名称,逗号后面为类名全称(命名空间+类名)。
(4)Common 项目的IOCReflecter.cs类根据配置文件获取对应接口的实例化对象,代码实现如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Reflection; using System.Configuration;namespace Common {public class IOCReflecter{private static Hashtable s_type=null;static IOCReflecter(){s_type = new Hashtable();}public static T CreateIntance<T>(){Type t=typeof(T);//keyType type = s_type[t] as Type;//valueif (type == null){string[] AssemblyInfos = ConfigurationManager.AppSettings[t.FullName].Split(',');type = Assembly.Load(AssemblyInfos[0]).GetType(AssemblyInfos[1]);s_type.Add(t, type);}return (T)CreateObject(type) ;}/// <summary>/// 根据typeName获取Type对象/// </summary>/// <param name="typeName"></param>/// <returns></returns>public static Type GetType(string typeName){if (string.IsNullOrWhiteSpace(typeName)){return null;}return Type.GetType(typeName);}/// <summary>/// 获取对象/// </summary>/// <param name="t"></param>/// <returns></returns>private static object CreateObject(Type t){if (t == null){return null;}//查找没有参数的构造函数//如果需要初始化带参数的构造函数 t.GetConstructors() 获取所有的构造函数 ,it.GetParameters()获取构造函数所有的参数,ConstructorInfo NonParameterConstructors= t.GetConstructors().Where(it=>it.GetParameters().Length==0).FirstOrDefault();if (NonParameterConstructors == null){throw new Exception( t.FullName+"必须有一个无参数或默认的构造函数");}//调用数构造函数创建对象return t.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);}} }
(5)测试
在IOCTest项目Controllers中添加HomeController.cs文件,代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using IBLL; using Common;namespace IOCTest.Controllers {public class HomeController : Controller{//// GET: /Home/public ActionResult Index(){//获取实例化对象IHelloWord hello = IOCReflecter.CreateIntance<IHelloWord>();ViewBag.Message = hello.SayHello("eric");return View();}} }
@{ViewBag.Title = "Index"; }<h2>@ViewBag.Message </h2>
最后上一张截图:
到此结束,准备收拾收拾下楼去吃饭,下午去国家图书馆看书,后续把AutoFac、Ninject、Utity总结一下,感觉Ninject比较好用,有兴趣的同学可以研究一下。
通过反射实现IOC功能相关推荐
- Java—实现 IOC 功能的简单 Spring 框架
编写一个实现 IOC 功能的简单 Spring 框架,包含对象注册.对象管理.及暴 露给外部获取对象的功能,并编写测试程序.扩展注册器的方式,要求采用 XML 和 txt 文件. 源代码 packag ...
- java获取method,2.5 反射——Class对象功能_获取Method
>[info] 反射--Class对象功能_获取Method * Method:方法对象 * 执行方法: * Object invoke(Object obj, Object... args) ...
- 架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC
从本文标题中可以看出,主要说的是反射技术和控制反转(IOC)技术,本文主要先介绍一下我对这两种技术的理解及它们的优缺点,最后再用实例来说一下使用方法. 反射:可以使用反射动态创建类型的实例,将类型绑定 ...
- Java反射及 IoC原理、内省机制
JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程 ...
- java 内省机制_Java反射及 IoC原理、内省机制
JAVA反射及IoC原理.JAVA内省 1. 反射反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述主要指程序可 ...
- 反射机制、反射机制的作用、反射机制的功能
文章目录 一.反射机制的作用 二.Java反射机制的功能 三.反射机制相关的重要的类有哪些? 一.反射机制的作用 通过java语言中的反射机制可以i操作字节码文件(读和修改字节码文件) 通过反射机制可 ...
- 使用 Spring 2.5 注释驱动的 IoC 功能
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- GenericFactoryMethod泛型工厂模式实现简单IOC功能
1.简介 泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别. 2.实战 还是房屋和道 ...
- 反射_Class对象功能_获取Field
* Field:成员变量 * 操作: 1. 设置值 * void set(Object obj, Object value) 2. ...
最新文章
- Oracle RESETLOGS 和 NORESETLOGS 区别说明
- ios::ate ios::app ios::out ios::in ios::trunc ios::binary(组合总结)
- 在Ubuntu上以精灵进程daemon process的方式启动一个命令
- 亚信科技公布2019年度业绩,5G商用效果凸显
- postman与Jmeter调用接口
- android 用LruCache读取大图片并缓存(转)
- 反射、注解、字节码、类加载机制
- 易语言群控雷电_安卓群控系统雷电模拟器安卓多开模拟器多开群控系统企业自动化的营销系统软件-资源下载随便下源码网...
- 【数据结构】经典习题
- Flak执行端口被占用OSError: [Errno 48] Address already in use
- 搜索引擎shodan
- Scalar Evolution
- [附源码]java毕业设计哈金院食堂美食评价系统
- [再寄小读者之数学篇](2014-06-26 绝对值不等式)
- Nacos2.0启动报错:Your project setup is incompatible with our requirements due to following reasons:
- 【融职培训】Web前端学习 第2章 网页重构11 HTML5新增标签
- qos 流控功能_01-QoS通道限速功能典型配置举例
- 批量查询圆通物流,并筛选更新量为1的单号
- FDN, SDN, ADN, BDN, MSISDN,LND, EXT1,EXT2, EXT3 代表的意义和作用
- 26岁,干了三年测试,月薪才12k,能跳槽找到一个更高薪资的工作吗?