举例:在每天的日常生活中,我们离不开水,电,气。在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭。而城市化之后,人们从这些琐事中解放了出来,城市中出现了水厂,发电厂,燃气公司。水,电,气我们自己打开开关用就可以而不用关心这些都是怎么来的,怎么实现的。控制反转指的就是由我们自己提供水电气发展为由政府提供水电气的整个过程。

可是在现实的编程世界中,我们只能怎么才能实现控制反转呢?这时依赖注入(DI: Independence Inject)出场了。依赖注入主要分为构造函数, 属性注入和依赖方法注入,注入。下面通过Unity框架对三种方式分别进行了实现:

电厂接口:IElectricity

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
interface IElectricity
{
string ProvideElectricity();
}
}

电厂类:ElectricityFactory

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
class ElectricityFactory:IElectricity
{
public string ProvideElectricity()
{
return "The electricity is coming!";
}
}
}

水厂接口:IWater

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
interface IWater
{
string ProvideWater();
}
}

水厂类:WaterFactory

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
class WaterFactory:IWater
{
public string ProvideWater()
{
return "The water is coming!";
}
}
}

人接口(人会用水,用电):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
public interface People
{
string UsingWater();
string UsingElectricity();
}
}

居民类(用构造函数,属性注入,依赖方法注入,三种方式分别对居民用水,用电方法进行的具体实现):

using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
#region 构造器注入
class ResidentsA:People
{
WaterFactory _wf;
ElectricityFactory _ef;
public ResidentsA(WaterFactory wf,ElectricityFactory ef)
{
this._ef = ef;
this._wf = wf;
}
public string UsingWater()
{
Console.WriteLine("I want to drink!");
return _wf.ProvideWater();
} public string UsingElectricity()
{
Console.WriteLine("I want to cook some food!");
return _ef.ProvideElectricity();
}
}
#endregion #region 属性注入
class ResidentsB : People
{
//属性注入
[Dependency]
public IWater _w { set; get; }
[Dependency]
public IElectricity _e { set; get; } public string UsingWater()
{
Console.WriteLine("I want to drink!");
return _w.ProvideWater();
} public string UsingElectricity()
{
Console.WriteLine("I want to cook some food!");
return _e.ProvideElectricity();
}
}
#endregion #region 依赖方法注入
class Residents : People
{
public IWater _iw;
public IElectricity _ie; public string UsingWater()
{
Console.WriteLine("I want to drink!");
return _iw.ProvideWater();
} public string UsingElectricity()
{
Console.WriteLine("I want to cook some food!");
return _ie.ProvideElectricity();
} [InjectionMethod]
public void UsingWaterTest(IWater iw)
{
Console.WriteLine("I want to drink!");
this._iw = iw;
} [InjectionMethod]
public void UsingElectricityTest(IElectricity ie)
{
Console.WriteLine("I want to cook some food!");
this._ie = ie;
}
}
#endregion
}

App.config配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<!--register type="full class name,namespace"--> <register type="IOCTesting.IWater,IOCTesting" mapTo="IOCTesting.WaterFactory,IOCTesting">
<lifetime type="singleton"/>
</register> <register type="IOCTesting.IElectricity,IOCTesting" mapTo="IOCTesting.ElectricityFactory,IOCTesting">
<lifetime type="singleton"/>
</register> <!--<register type="IOCTesting.People,IOCTesting" mapTo="IOCTesting.ResidentsA,IOCTesting">
<lifetime type="singleton"/>
</register>-->
<!--<register type="IOCTesting.People,IOCTesting" mapTo="IOCTesting.ResidentsB,IOCTesting">
<lifetime type="singleton"/>
</register>-->
<register type="IOCTesting.People,IOCTesting" mapTo="IOCTesting.Residents,IOCTesting">
<lifetime type="singleton"/>
</register>
</container>
</unity>
</configuration>

具体的调用类Program.cs:

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IOCTesting
{
class Program
{
static void Main(string[] args)
{
//配置文件注册
IUnityContainer mycontanier = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection("unity");
section.Configure(mycontanier); //创建调用者
//Console.WriteLine("-------------------Constructor Injection-------------------");
//ResidentsA pa = mycontanier.Resolve<People>() as ResidentsA;
//Console.WriteLine(pa.UsingWater());
//Console.WriteLine(pa.UsingElectricity()); //Console.WriteLine("-------------------Property Injection-------------------");
//ResidentsB pb = mycontanier.Resolve<People>() as ResidentsB;
//Console.WriteLine(pb.UsingWater());
//Console.WriteLine(pb.UsingElectricity()); Console.WriteLine("-------------------Method Injection-------------------");
Residents p = mycontanier.Resolve<People>() as Residents;
Console.WriteLine(p._iw.ProvideWater());
Console.WriteLine(p._ie.ProvideElectricity()); Console.ReadLine();
}
}
}

(备注:Unity框架需要提前自己安装,其实就是引用了两个包而已,在测试的过程中,如需测试构造函数注入,则需要在App.config和Program.cs中注释掉属性注入,依赖方法注入部分,否则会报错。)

ps. 1. 依赖方法注入会在被依赖对象创建时自动调用;

2. 由于被依赖对象是在程序运行时创建的所以这里面又用到了反射的技术,对于反射,我会继续创建反射的例子进行说明。

C# 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)的更多相关文章

  1. 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)

    举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...

  2. 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解

    一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...

  3. 什么是控制反转(IoC)?什么是依赖注入(DI)?以及实现原理

    ​ IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试:有了 ...

  4. 【Java_Spring】控制反转IOC(Inversion of Control)

    1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的 ...

  5. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  6. 依赖注入(DI)和控制反转(IOC)

    依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...

  7. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  8. IOC 控制反转(Inversion of Control,英文缩写为IoC)

    在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 在这样的齿轮组中,因为是协同工作,如果有一个齿轮出了问题,就可能会影响到整个齿 ...

  9. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

随机推荐

  1. 关于photoshop处理图片的自动化

    如果打印一个图片我们只需要点击几个按钮就可以完成了,但如果有100多个图片需要打印,那就需要点击几百次按钮,而且这个过程中有很多操作是相同的.能不能简化这个过程呢?是可以的,在photoshop中实现 ...

  2. zookeeper生成节点、删除节点 For Java

    源码地址https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/zooke ...

  3. 前端学习01-06URL

    URL(Uniform Resource Locator) 统一资源定位 URL的基本组成:协议,主机名,端口号,资源名 例如: http://www.sina.com:80/index.html 相 ...

  4. 《Effective Java》第10章 发并

    第66条:同步访问共享的可变数据 Java语言规范保证读或者写一个变量是原子的(atomic ) ,除非这个变量的类型为long或者double. [java中long和double类型操作的非原子性 ...

  5. Java的get请求-----接口测试

    package findyou.Interface; import java.net.HttpURLConnection; import java.net.URL; public class URLC ...

  6. Spring 第一个程序-Bean的定义和注册

    定义一个实现接口的方法 创建xml文件,这个xml文件就是个所谓的容器         不使用spring容器和使用spring容器创建对象执行代码的区别如下:   下面说一下ApplicationC ...

  7. 最常用的15个前端表单验证JS正则表达式

    在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,本文收集整理了15个常用的JavaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份 ...

  8. SQL 分组后拼接字符串

    with t as( select 'Charles' parent, 'William' child union select 'Charles', 'Harry' union select 'An ...

  9. Java实现终止线程池中正在运行的定时任务

    源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...

  10. Python学习第三方库Requests: 让 HTTP 服务人类

    转自官方文档:http://cn.python-requests.org/zh_CN/latest/ 快速上手 http://cn.python-requests.org/zh_CN/latest/u ...