反射实现IOC功能
通过反射实现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[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功能的更多相关文章
- 通过反射实现IOC功能
这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...
- 反射应用--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 控制反转是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度 ...
随机推荐
- EF4.1: Add/Attach and Entity States(EF中的实体状态转换说明)
实体的状态,连接以及 SaveChanges 方法 数据库上下文对象维护内存中的对象与数据库中数据行之间的同步.这些信息在调用 SaveChanges方法被调用的时候使用.例如,当使用 Add 方法传 ...
- css布局之选择切换按钮
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(四)
对li标签的相关操作——五种方式给奇数项li标签设置样式 demo演示: 1 2 3 4 5 6 7 // 详解: 通常我们为多个li添加样式时常用的是使用filter,但我们在第三节中可以看到fil ...
- 文档流 css中间float clear和布局
文档流 先说说什么是公文流转 什么流 它是一系列连续的东西 <div style="background-color:pink;width:40px;height:80px;&quo ...
- VS2012使用XListCtrl
XListCtrl.强大ListCtrl.到现在,所有我曾经遇到过ListCtrl我们使用XListCtrl攻克. XListCtrl有什么可以支持? 变化column背景颜色.尺寸.线.制作chec ...
- Vs2012 构建配置 Lua5.2.3
随着手机游戏client程序员,当然,遇到这样的问题,该游戏已经提交出版.但第二天一早,发现有一个逻辑游戏BUG.怎么办,不严重,在一般情况下,非强制性的更新.假设一个严重BUG,他们将不得不强制更新 ...
- linux添加静态路由表,重新启动继续有效
在日常使用中.要么server于.有两个地址,两块网卡的配置,访问不同网段.这样的情况是非常普遍的现象.但,我们需要添加到路由表中的一个额外的,以确定通过正确的网关发送的数据包,并interface能 ...
- Hadoop群集设置
Hadoop群集设置 近期特别看了Hadoop的资料.感觉特别好,整理一下发在自己的博客上,希望对想了解集群的网友有所帮助. 參考资料:http://hadoop.apache.org/docs/r1 ...
- android KK版本号,如何更改蓝牙设备类型
mediatek/external/bluetooth/bt_cust/bt_cust_table.h { .name = "ClassOfDevice", ...
- [Unity3D]Unity3D游戏开发之刀光剑影特效的实现
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国 ...