控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)
举例:在每天的日常生活中,我们离不开水,电,气。在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭。而城市化之后,人们从这些琐事中解放了出来,城市中出现了水厂,发电厂,燃气公司。水,电,气我们自己打开开关用就可以而不用关心这些都是怎么来的,怎么实现的。控制反转指的就是由我们自己提供水电气发展为由政府提供水电气的整个过程。
可是在现实的编程世界中,我们只能怎么才能实现控制反转呢?这时依赖注入(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. 由于被依赖对象是在程序运行时创建的所以这里面又用到了反射的技术,对于反射,我会继续创建反射的例子进行说明。
控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)的更多相关文章
- C# 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)
举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...
- 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
- 什么是控制反转(IoC)?什么是依赖注入(DI)?以及实现原理
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试:有了 ...
- 【Java_Spring】控制反转IOC(Inversion of Control)
1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的 ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- 控制反转IOC与依赖注入DI【转】
转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...
- 控制反转IOC与依赖注入DI - 理论篇
学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
方式一: 数据存储模型Model:此方式未用到数据存储模型Model,仅简单的字符串string型数据传递 前台接收显示数据视图View: <div style="height:300 ...
- canvas 实现 柱状图
define([],function(){ var myChart={ init:function(options){ this.ctx = options.ctx; this.data = opti ...
- 检测中文长度gbk下2个字节
//$str = 'fff&sdf你是sdf好fdf啊b歌hello中world';$str = 'd你b_fff是好啊歌中潺潺 ';echo chineselength($str).&quo ...
- Qt字符串类——2. 查询字符串数据
(1)函数QString::startsWith()判断一个字符串是否以某个字符串开头.此函数具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏感的),例如 ...
- 《30天自制操作系统》12_day_学习笔记
harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...
- ESB 中的流量控制
ESB 中的流量控制
- [python]用Python进行SQLite数据库操作
用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~ ]: u ...
- Master page and jquery
1.download latest jqury http://jquery.com/download/ 2.download latest jquery.ui, Theme select " ...
- PDO处理大批量数据的入库
<?php //最东端 东经135度2分30秒 //最西端 东经73度40分 //最南端 北纬3度52分 //最北端 北纬53度33分 //转换为度的单位$dbName = 'txhl';//数 ...
- Android实现归属地查询功能
实现归属地查询大体有两种方法可以实现,一种是通过归属地API进行查询,另一种是查询本地数据库.两种方法各有优劣,最好结合起来使用,我本次采用的是查询数据库的方法.首先需要从网上下载归属地数据库call ...