IoC的全称为Inversion of Control(控制反转),DI的全称为Dependency Injection(依赖注入)。IoC是一个控制容器,我们将设计好的对象放入到容器中,将对象交给容器去主动创建。DI是容器的运行机制,在IoC容器的运行期间,动态的将对象所依赖的对象注入到对象之中。

关于IoC框架有很多,比如从Java中移植过来的Spring.NET和微软的Unity等,这篇文章主要介绍Unity的使用。

我们拿人与手机来做一个示例,在示例中我们需要输出这个人在玩什么手机的一段文字,所以我们需要一下类:

  • People:人类
  • Phone:手机类

People类依赖Phone类,但没有在People类中主动new依赖对象,而是添加了一个带有参数的构造方法,等待依赖对象被注入:

public interface IPeople
{
void PlayPhone();
} public class People : IPeople
{
IPhone _phone = null;
public People(IPhone phone)
{
_phone = phone;
} public void PlayPhone()
{
Console.WriteLine("Play {0}", _phone.IPhoneXS());
}
} public interface IPhone
{
string IPhoneXS();
} public class Phone : IPhone
{
public string IPhoneXS()
{
return "iPhone XS";
}
}

通过注册的方式在控制台输出文字:

static void Main(string[] args)
{
// 初始化容器
UnityContainer unityContainer = new UnityContainer(); // 注册依赖对象
unityContainer.RegisterType<IApple, Apple>();
// 注册调用者
unityContainer.RegisterType<IPeople, People>(); // 返回调用者
IPeople people = unityContainer.Resolve<IPeople>();
people.PlayPhone(); Console.ReadLine();
}

通过传参的方式在控制台输出文字:

static void Main(string[] args)
{
// 初始化容器
UnityContainer unityContainer = new UnityContainer(); // 注册调用者
unityContainer.RegisterType<IPeople, People>(); // 返回调用者并传递参数
// Unity 5.9.x版本语法
ParameterOverride param = new ParameterOverride("phone", new Phone { Name = "IPhone XS" });
IPeople people = unityContainer.Resolve<IPeople>(param); // Unity 5.8.x及以下版本语法
//IPeople people = unityContainer.Resolve<IPeople>(new ParameterOverrides
//{
// { "apple", new Apple() }
//}); people.PlayPhone(); Console.ReadLine();
}

使用IoC容器可以使对象与对象之间的耦合降低,这样整体的架构就变得更加的灵活,维护起来也会变得更加的方便。

作者:huayueniansi
链接:https://www.jianshu.com/p/b30f42245d01
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

IoC与DI,Unity的使用的更多相关文章

  1. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  2. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  3. 深入理解IOC模式及Unity框架

    研究了下,有几篇博客确实已经说得很清楚了 1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html  这篇博客是通过一个 ...

  4. IoC和DI的理解

    1 概述 当我们想闭上眼睛想如何让我们的软件更加可用可维护时,我们总能想到一个词:松耦合.在这篇文章中,主要讲述了模块间存在的依赖关系,但这种依赖关系违背了依赖倒置原则.在这之后,我们将讨论一种解除软 ...

  5. 深入理解DIP、IoC、DI以及IoC容器(转)

    深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...

  6. 【转】深入理解DIP、IoC、DI以及IoC容器

    原文链接:http://www.cnblogs.com/liuhaorain/p/3747470.html 前言 对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有 ...

  7. DIP、IoC、DI以及IoC容器

    深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...

  8. 【来龙去脉系列】深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  9. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  10. IOC模式及Unity框架文章收藏

    1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html 通过Unity实现IOC容器. 2.深入理解DIP.IoC.D ...

随机推荐

  1. CSS浏览器兼容性

    答题技巧:因为这个问题主要是看你经验,一般有了开发经验的都会遇到这样的坑,你只要说出几个来大致就可以了. 1.对齐文本和文本输入框 问题: 当input元素在设置了高时,在IE7.IE8.IE9下会出 ...

  2. JS相比TS的缺点(或TS的优点)

    JS只有在运行时,才会抛出错误, JS里有任何的拼写错误 都不会提示错误 JS运行时报的错,指向也未必是错误的源头,也就是说:A类里因为书写代码有误,会造成运行时其他的类报错如B JS无法做到不同pa ...

  3. echart 属性设计大全

    // 全图默认背景  // backgroundColor: ‘rgba(0,0,0,0)’, // 默认色板 color: ['#ff7f50','#87cefa','#da70d6','#32cd ...

  4. 微信支付MD5签名算法C#版,ASCII码字典序排序0,A,B,a,b

    /// <summary> /// 微信支付MD5签名算法,ASCII码字典序排序0,A,B,a,b /// </summary> /// <param name=&qu ...

  5. js中跳出forEach循环

    缘由:近期在项目中使用lodash.js中的_.foreach方法处理数据,需要在满足条件时结束循环并不执行后面的js代码. 因为foreach中默认没有break方法.在尝试中使用了return f ...

  6. html a标签链接点击闪动问题解决

    <a href="#">链接点击会闪动,解决: 这三种都可以用:<a href="javascript:;"></a>< ...

  7. LINUX VSFTP配置及安装

    ------------------转载:亲身实践,确实好用(http://www.cnblogs.com/jack-Star/p/4089547.html) 1.VSFTP简介 VSFTP是一个基于 ...

  8. vue 打包上线后 所使用的css3渐变属性丢失的问题解决方案

    最近在做vue项目的时候用到了css3渐变属性,本地跑项目没问题,但是打包放到服务器后发现这个属性丢失了.如下图: .join{ position:absolute; left:1rem; botto ...

  9. count(*),count(1),count(列名)的区别

    count(*)和count(1)无任何差别,永远优于count其他字段只要存在普通索引,count就会使用普通索引,只存在主键时,count(*)和或count(1)会使用主键索引 count(a) ...

  10. UI定位元素大全(跟App定位元素差不多哦)

    selenium+python自动化之元素定位 作者:一飞冲天 同样的道理,把一个页面上的元素当成是一个对象(你的女神),我们就可以通过她的属性值来找到她,比如她性别女爱好爬山---------你就可 ...