控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。

IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。

Martin Fowler在那篇著名的文章《Inversion of Control Containers and the Dependency Injection pattern》中将具体依赖注入划分为三种形式,即构造器注入、属性(设置)注入和接口注入,习惯将其划分为一种(类型)匹配和三种注入:

  • 类型匹配(Type Matching):虽然我们通过接口(或者抽象类)来进行服务调用,但是服务本身还是实现在某个具体的服务类型中,这就需要某个类型注册机制来解决服务接口和服务类型之间的匹配关系;
  • 构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象;
  • 属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性;
  • 方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。

这里讲解.NET的Microsoft.Practices.Unity、Microsoft.Practices.Unity.Configuration和System.ComponentModel.Composition。

1、 首先讲解Microsoft.Practices.Unity讲解,这里不区分是哪一种注入,只为实现功能。

public interface IKiss
{
string kiss();
} public class Boy : IKiss
{
public string kiss()
{
return "boy kissing";
}
} public class Lisy : IKiss
{
public string kiss()
{
return "Lisy kissing";
}
}
 //通过直接创建的方式,在main中写
//创建容器
IUnityContainer container = new UnityContainer();
//注册映射
container.RegisterType<IKiss, Boy>();
//得到Boy的实例
var boy = container.Resolve<IKiss>();
Title=boy.kiss();
通过配置调用
///通过配置
IUnityContainer container = new UnityContainer();
UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName)
as UnityConfigurationSection;
configuration.Configure(container, "defaultContainer");
var Lisy = container.Resolve<IKiss>("Lisy");
Title = Lisy.kiss();
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="TestDependency.IKiss,TestDependency" name="Boy" mapTo="TestDependency.Boy,TestDependency" />
<register type="TestDependency.IKiss,TestDependency" name="Lisy" mapTo="TestDependency.Lisy,TestDependency" />
</container>
</containers>
</unity>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="ConsoleApplication1.IA,ConsoleApplication1" mapTo="ConsoleApplication1.A,ConsoleApplication1" />
<register type="ConsoleApplication1.IB,ConsoleApplication1" mapTo="ConsoleApplication1.B,ConsoleApplication1" />
<register type="ConsoleApplication1.IC,ConsoleApplication1" mapTo="ConsoleApplication1.C,ConsoleApplication1" />
<register type="ConsoleApplication1.ID,ConsoleApplication1" mapTo="ConsoleApplication1.D,ConsoleApplication1" />
</container>
</containers>
</unity>
</configuration>
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
UnityContainer container = new UnityContainer();
UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
configuration.Configure(container, "defaultContainer");
A a = container.Resolve<IA>() as A;
if (null != a)
{
Console.WriteLine("a.B==null?{0}", a.B == null ? "Yes" : "No");
Console.WriteLine("a.C==null?{0}", a.C == null ? "Yes" : "No");
Console.WriteLine("a.D==null?{0}", a.D == null ? "Yes" : "No");
}
Console.WriteLine(a.kiss()); //Lily lily = new Lily(boy);
//lily.kiss();
Console.Read();
}
} public interface IKiss
{
string kiss();
} public class Lily : IKiss
{ public IKiss boy; public Lily(IKiss boy)
{
this.boy = boy;
}
public string kiss()
{
return "lily kissing";
}
} public class Boy : IKiss
{
public string kiss()
{
return "boy kissing";
}
} public interface IA { string kiss(); }
public interface IB { string kiss(); }
public interface IC { string kiss();}
public interface ID { string kiss();}
public class A : IA
{
public IB B { get; set; }
//构造器注入
public A(IB b)
{
this.B = b;
Console.WriteLine("属性注入");
} //属性注入,这种笔构造器和方法注方便
[Dependency]
public IC C { get; set; } //方法注入
public ID D { get; set; } [InjectionMethod]
public void Initalize(ID d)
{
this.D = d;
Console.WriteLine("构造器注入");
}
public string kiss()
{
return "IA kissing "+B.kiss() +" "+C.kiss() +" "+D.kiss();
}
}
public class B : IB
{
public string kiss()
{
return "IB kissing";
}
}
public class C : IC
{
public string kiss()
{
return "IC kissing";
}
}
public class D : ID
{
public string kiss()
{
return "ID kissing";
}
}
}

2.第二种System.ComponentModel.Composition

 public interface ITestService
{
string GetUserName();
} [Export(typeof(ITestService))]
public class TestService : ITestService
{
public string GetUserName()
{
return "Hello World!";
}
}

执行

    [Import]
public ITestService TestService { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
Title = TestService.GetUserName();
}

IOC学习的更多相关文章

  1. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  2. IOC学习1

    学习蒋金楠的 ASP.NET Core中的依赖注入(1):控制反转(IoC) 而来,这篇文章经典异常.一定要多读.反复读. 这篇文章举了一个例子,就是所谓的mvc框架,一开始介绍mvc的思想,由一个d ...

  3. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...

  4. Spring学习笔记(4)——IoC学习

    IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表 ...

  5. Spring5 概述及Spring IOC学习

    Spring Framework 5 1. Spring框架 1.1 Spring框架概述 1.2 主要内容 Spring框架是一个开源的JavaEE的应用程序 主要核心是 IOC(控制反转)和AOP ...

  6. Spring IOC学习

    IoC基础 控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象 ...

  7. Struts2学习-Ioc学习-spring

    1.面向对象写法(带着面向过程的思维)电脑 computer = new 电脑(); [电脑代码中 new 打印机()]computer.打印文本("hello 140"); 电脑 ...

  8. Spring框架学习(2)IOC学习

    内容源自:IOC理解   spring ioc注入的三种方式  ioc工厂bean深入理解 耦合性,在java中表现为类之间的关系,耦合性强说明类之间的依赖关系强: 侵入性:框架对代码的侵入: 在传统 ...

  9. 一、Spring的控制反转(IOC)学习

    一.控制反转 1.什么是控制反转? 控制反转(Inversion of Control,缩写为IoC),是面向对象中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(D ...

随机推荐

  1. 2015 FVDI V6.3 Software Free Download

    2015 FVDI with software USB dongle has newly upgraded to V6.3. Here software upgrade list: ABRITES C ...

  2. Auto Layout 在iOS屏幕适配中的使用

    前几天在做iOS屏幕的适配,也就是让同样的UI控件的布局在不同屏幕的iOS设备上面都正确显示,storyBoard就无可避免的用到了Auto Layout.在这个过程中,我发现要熟练掌握Auto La ...

  3. Ionic Android开发环境搭建 下

    上篇 Ionic 安装完成了,由于要开发Android,所以必不可少需要继续搭建Android开发环境. 首先,下载并安装JDK.然后配置一下环境变量. 接着,下载并安装Android SDK.下载过 ...

  4. Android 联系人字母排序(仿微信)

    现在很多APP只要涉及到联系人的界面,几乎都会采取字母排序以及导航的方式.作为程序猿,这种已经普及的需求还是需要学习的,于是小生开始了在网上默默的学习之路,网上学习的资料质量参差不齐,不过也有很不错的 ...

  5. 【学习笔记】【C语言】scanf函数

    1. 简介 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设 ...

  6. "Could not load file or assembly 'DTcms.Web.UI' or one of its dependencies. 拒绝访问。" 的解决办法

    出现的问题提示如下:

  7. 20140213-想念是while里的死循环

    // stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件// #pragma once#include "targetver.h&qu ...

  8. UNIX 信号基本概念

    1. 信号的基本概念 为了理解信号,先从我们最熟悉的场景说起: 用户输入命令,在Shell下启动一个前台进程. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断. 如果CPU当前正在执行这个进程的代 ...

  9. linux下usb驱动接口中端点介绍

    端点 USB 通讯的最基本形式是通过一个称为端点的东西.一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点)).端点可被看作一个单向的管道. 一个 USB ...

  10. CXF调用wsdl2java生成客户端异常

    用cxf生成java客户端代码的时候出现异常: undefined element declaration 's:schema'   解决办法:1.删除   2.替换   参考资料:   http:/ ...