NET笔记——IOC详解和Unity基础使用介绍
说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己。
IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转呢?
按我现在的理解,把上端依赖的项从细节转换为抽象,并把细节转移到第三方,这个就叫控制反转。
怎么理解呢?最简单的:我们有一个接口Ianimal,就像这样:
public interface iAnimal
{
void talk();
}
然后我们现在用另一个类去实现该接口:
public class dog : iAnimal
{
public void talk()
{
Console.Write("小狗说:汪汪汪!");
}
}
然后呢,往常来讲,我们应该是这样调用的:
iAnimal dog = new dog();
dog.talk();
Console.ReadKey();
运行结果应该是这样的:

到目前为止都是正确的,相信各位小伙伴一般也是如此。
但请注意,我们在调用时是直接用dog类型new出来的,这种做法其实就已经依赖于细节了。
那么如何将这里依赖的细节修改为抽象呢?很简单,我们只需要一个工厂类帮助我们生成实际的类即可。
但是有些小伙伴可能想,工厂内也有细节啊,难道写个工厂就是IOC了么?
当然不是,我们还将细节交给配置文件(通过反射),这样在功能变动时,无需修改原代码,只需要修改配置文件即可。
工厂看上去是这样的:
public class SimpleFactory
{
public static iAnimal CreateAnimal()
{
string classModule = ConfigurationManager.AppSettings["PhoneType"];
Assembly assembly = Assembly.Load(classModule.Split(',')[1]);
Type type = assembly.GetType(classModule.Split(',')[0]);
return (iAnimal)Activator.CreateInstance(type);
}
}
而我们的配置文件自然也要写点东西了:
<appSettings>
<add key="AnimalType" value="IOCandDI.dog,IOCandDI"/>
</appSettings>
value内,逗号前是类的全限定名(命名空间+类名),后面是命名空间。
不会操作配置文件的小伙伴们,先添加这个引用:

然后引入System.Configuration命名空间就可以操作啦。
至于反射,直接引入System.Reflection 命名空间即可操作。反射的原理也很简单,在这里就不再赘述。
修改过后的调用和以前的调用对比:
iAnimal dog = new dog();
dog.talk(); iAnimal obj = SimpleFactory.CreateAnimal();
obj.talk();
Console.ReadKey();
结果是一样的:

这个时候,如果再多一种动物,只需要添加一个继承iAnimal接口的类,并且修改配置文件即可。
IOC带给我们的便利正是如此。
微软也推出了一款IOC的插件,叫做Unity,你在NuGet程序包管理中很轻松就能找到它:

首先是下载与安装:

然后在页面引入Microsoft.Practices.Unity就可以操作了,基本流程如下:
IUnityContainer container = new UnityContainer();//声明容器
container.RegisterType<iAnimal, cat>();//注册类型
iAnimal obj = container.Resolve<cat>();//完成实例
obj.talk();
运行效果:

了解了Unity的基础用法,我们在来看下如何利用Unity做依赖注入(DI——dependency injection)。
说到DI,就一定要知道DI的三种方式:属性注入、构造注入、方法注入。我这里直接改造了cat类:
public class cat : iAnimal
{
[Dependency]
public iColor color { get; set; }
public iEat eat { get; set; }
public iRun run { get; set; } [InjectionConstructor]
public cat(iEat ieat)
{
eat = ieat;
} public void talk()
{
Console.WriteLine("小猫说:喵喵喵!");
} [InjectionMethod]
public void Happy(iRun irun)
{
run = irun;
}
}
大家一定发现了我分别在属性、构造、方法头上加了特性。
实际上,Dependency、InjectionConstructor、InjectionMethod就是Unity中DI操作的标识符,它们分别对应属性注入、构造注入、方法注入。
那么,这些特性是如何帮助程序完成DI的呢?看调用代码:
IUnityContainer container = new UnityContainer();
container.RegisterType<iAnimal, cat>();
container.RegisterType<iColor, Color>();
container.RegisterType<iEat, Eat>();
container.RegisterType<iRun, Run>();
iAnimal obj = container.Resolve<cat>();
obj.talk();
cat myCat = (cat)obj;
Console.WriteLine("myCat.color是空的么?{0}", myCat.color == null);
Console.WriteLine("myCat.eat是空的么?{0}", myCat.eat == null);
Console.WriteLine("myCat.run是空的么?{0}", myCat.run == null);
Console.ReadKey();
在Unity容器内类型注册时,需注册cat类内3个参数的类型,用来对应3种注入方式。
运行结果如下:

3种注入方式都成功了~添加了特性的属性(或方法)在Unity容器执行实例时会自动寻找上面3个特性(的位置)并匹配注册类型(完成注入)。
需要注意的是,构造注入无需声明特性也可生效,Unity会自动寻找参数最多的构造参数进行注入(前提是被注入的参数类型一定要注册)。
ADD:在和一位小伙伴讨论时,他指出了我unity的使用方法有问题,我这里的确没有将unity容器的细节抽出到配置文件中(因为想着是基础使用教程就没有加),这一方面我也懒得再写,找到一篇介绍详细的博文供大家参考——http://www.cnblogs.com/junchu25/archive/2012/08/10/2631455.html
NET笔记——IOC详解和Unity基础使用介绍的更多相关文章
- IOC详解和Unity基础使用介绍
说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己. IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转 ...
- Spring4 IOC详解
Spring4 IOC详解 上一章对Spring做一个快速入门的教程,其中只是简单的提到了IOC的特性.本章便对Spring的IOC进行一个详解.主要从三个方面开始:基于xml文件的Bean配置,基于 ...
- Scrapy笔记04- Selector详解
Scrapy笔记04- Selector详解 在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行 ...
- JAVASCRIPT事件详解-------原生事件基础....
javaScirpt事件详解-原生事件基础(一) 事件 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能 ...
- Scrapy笔记03- Spider详解
Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...
- Scrapy笔记05- Item详解
Scrapy笔记05- Item详解 Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便. Item提供了类字典的API, ...
- C++游戏服务器编程笔记 IP详解
C++游戏服务器编程笔记 IP详解 IP详解 INTERNET的历史 上世纪60年底起源于美国 1992年,Internet上的主机超过了100万台 现在已经是现代文明人的必需品 TCP/IP的 ...
- Spring IoC详解
Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
随机推荐
- .pfx格式和.Cer格式的区别
ize:12px">作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义, ...
- Java中字符流与字节流的区别
字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...
- debian添加新硬盘
1.查看硬盘设备,找到要添加的硬盘/dev/sdbfdisk -l 2.创建硬盘分区fdisk /dev/sdb进入到fdisk程序 p 命令显示硬盘的分区表信息n 添加新分区 (1) n 添加新 ...
- MVC - 模型验证
使用MVC的数据验证特性可以自动实现客户端验证和服务端验证 假设有一个Employee类 public class Employee { public int ID { get; set; } pub ...
- Android_listView_exc
listView布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- C++学习(一)
一.C++语言语法基础(6)1.从C到C++的过渡(1)2.类和对象(2)剑3.操作符重载(1)4.继承与多态(1)5.异常和I/O流(1)二.数据结构和算法(3)1.基本数据结构,堆栈.队列.链表. ...
- HDU-1052(贪心策略)
Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...
- .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...
- Log4Net详细配置
关于Log4Net配置主要分几步 第一步:下载log4net.dll(log4net官网:http://logging.apache.org/log4net/download_log4net.cgi) ...
- SQLServer 在Visual Studio的连接方法
一.Sql Server 在Visual Studio的连接有两种方法: (1)本地计算机连接; [c#] view plaincopy string s = "Data Sourc ...