通过反射实现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);//key
Type type = s_type[t] as Type;//value
if (type == null)
{
string[] AssemblyInfos = ConfigurationManager.AppSettings[t.FullName].Split(',');
type = Assembly.Load(AssemblyInfos[]).GetType(AssemblyInfos[]);
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==).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功能的更多相关文章
- 反射实现IOC功能
通过反射实现IOC功能 这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET ...
- 反射应用--IOC和AOP
反射最大的价值就是用来写框架,下面贴出自己的3篇代码,模拟实现SPING框架的bean工厂,IOC,AOP.当然这里重点是在利用反射实现功能,为了图方便,我用的是Properties文件,关于XML后 ...
- 使用 Spring 2.5 注释驱动的 IoC 功能(转)
基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean.装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换 ...
- 手写一个HTTP框架:两个类实现基本的IoC功能
jsoncat: 仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 国庆节的时候,我就已经把 jsoncat 的 IoC 功能给写了,具体可以看这篇文章&l ...
- 手动模拟实现Spring IOC功能(基于javaConfig风格)
以下文中spring特指spring frameWork项目,不含其它:如spring cloud等. 作为刚开始研究spring源码的小白,对于spring两大核心功能之一的IOC,虽说大致了解了B ...
- 【转载-好文】使用 Spring 2.5 注释驱动的 IoC 功能
在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 原文链接:https://www.ibm.com/developerworks/cn/java/j-lo-spring25 ...
- 实现IOC功能的简单Spring框架
需求分析 设计一个含有IOC的简单Spring,要求含有对象注册.对象管理以及暴露给外部的获取对象功能. 项目设计 对于注册的对象用一个类BeanInfo来描述其信息,包括对象标识.全类名以及属性名与 ...
- 使用 Spring 2.5 注释驱动的 IoC 功能
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- .net中反射与IOC容器实现
反射还是很有用的,比如IOC容器基本上都是通过反射实现的. IOC是什么 IOC:Inversion of Control 控制反转是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度 ...
随机推荐
- 以太坊Inner Transaction合约内充值转账
- centos 7 安装python 3.x
首先 安装一些 可能需要的依赖: yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-d ...
- Linux驱动之异步OR同步,阻塞OR非阻塞概念介绍
链接:https://www.zhihu.com/question/19732473/answer/20851256 1.同步与异步同步和异步关注的是消息通信机制 (synchronous commu ...
- 时间戳转中国人能看得懂的日期格式 yy-mm-dd
很多项目都会用到时间戳的转换 说实话 我现在的这家公司超级好 因为后太要求传数据的时候竟然可以是时间戳的格式 我觉得我好幸福 哈哈哈 不过 等后台转给你数据的时候很多时候都是时间戳 这时候就得前端转 ...
- 用ps增加照片的气氛--镜头光晕
1.寻找一张图片 2.新建一个图层填充为黑色 3.选择滤镜---渲染---镜头光晕 4.选择图层模式---滤色. 编辑:千锋UI设计
- CDH 安装
CDH 安装 市场上免费大数据框架主要有三个版本,原生的 Apache 版本,Cloudera(https://www.cloudera.com/) 公司研发的(Cloudera Distributi ...
- 复制命令(XCOPY)
XCOPY 命令: // 描述: 将文件或目录(包括子目录)从一个位置复制到另一个位置. // 语法: Xcopy <Source> [<Destination>] [/w] ...
- 学习blinker
from blinker import signal do_sth = signal('do_sth') #创建信号 def process(f, a, b, **kwargs): f(a, b, * ...
- 第一个VS2015 Xaramin Android项目(续)
上文说到已经第一个 App已经可以运行,但是并不能调试! 经过细心发现,我察觉到VS刚开始进入了调试模式,但是一闪而过.也就是说调试失败了,此时需要等待一段时间才能打开此App,如果立即打开App 会 ...
- 你会跟谁结婚zz
正文 咱们日课去年有篇文章叫<你会跟谁结婚?>,提到经济学家的数据显示,现在美国的婚姻中“强强联合”的现象越来越严重,高收入者和高收入者结婚,高学历者和高学历者结婚. 经济学家很无奈,我们 ...