控制反转(IoC, Inversion of Control),依赖注入(DI, Dependency Injection)是在面向对象编程中经常碰到的专业术语。很多朋友可能在百度之后,便浅尝辄止,没有深入理解这两种思想的精髓。我们在查找IoC的含义的过程中,可能 见过这句通俗的解释:你呆着别动,到时我会找你。这句解释到底应该如何去理解呢?下面,我们结合具体的业务场景和其实现方式的研究,来对IoC以及DI做一个比较详细的解释,希望能够对初学者有所启发。

一. 一个常见的业务场景

  在移动互联网APP中,几乎都要使用推送信息的功能,如:我们经常会在周五晚上收到APP的推送消息,这样的消息形式包括APP自有推送(通知栏),短信推送(短信中的通知类消息,有可能被过滤),邮件推送,微信推送,甚至以后还可能拓展到穿戴式设备推送,消息的形式非常丰富。而推送的消息中,主要是一些商品推荐类,内容推荐类或者系统通知类的内容。假定现在公司要你负责这部分推送功能的架构和实现,你应该如何去设计呢?

  这个业务场景可以说在每个移动互联网公司都会遇到。假如该公司的名称为XM,负责实现该部分功能的小组中有三位研发成员,分别是:小A,小B和小C。如何对该功能系统进行整体架构,使得开发效率最高?我们可以围绕以下几个问题,进行逐步探讨:

  • 如果只实现短信推送的功能,如何设计和实现?
  • 怎么使系统保持可扩展性,减少研发人员的修改工作?
  • 可以彻底省去对代码的修改吗?

  我们围绕这三个具体的问题,来一步步实现和改进我们的系统。

二. 功能的设计实现与改进

2.1 程序实现V1.0

  首先,短信推送的功能,要今天晚上开发上线。三个人一听就慌了,还有五个小时,顾不上考虑那么多了,先把功能开发出来再说。于是,三个人经过简单的讨论,将系统的实现架构设计如下:

  

  根据系统设计,分工如下:由小A负责业逻辑控制模块LogicController的开发,此处简化为XM.LogicController.exe;由小B负责推送消息管理(PushMsgService),并集成到组件 XM.MsgService.dll中;由小C负责短信功能帮助类(SMSHelper),并提供组件XM.SMS.dll。

  根据以上的设计和分工,不到一个小时,功能便做出来了。各自的代码如下:

  小C的短信功能帮助类核心代码:

 public class SMSHelper
{
public void Send(string message)
{
Console.Write("From SMS: " + message);
}
}

  小B的消息管理模块核心代码如下:

 public class PushMsgService
{
SMSHelper pushTool; public PushMsgService()
{
pushTool = new SMSHelper();
} public void Push(string message)
{
pushTool.Send(message);
}
}

  小A的业务集成模块的核心代码如下:

 string message = "今日特价:创意城绿茶餐厅30元4人餐";
MsgService.PushMsgService service = new MsgService.PushMsgService();
service.Push(message);

  三个人经过短暂的拼搏,终于完成了任务,顺利上线了产品。做完之后,三个人洋洋得意的push了代码,一块去街边撸串去了。当日,系统运行良好,无任何bug出现。第二天,相应的功能被移植到了公司的其他部门。如:后台编辑部开发的推送管理系统,也需要此功能;运营部开发的产品推荐系统,也需要此功能;人力资源部门的招聘管理系统,也需要此功能。短信消息推送的功能,在各个部门里面,被广泛的应用,都是采用ABC开发的这一套库去做的实现。

2.2 程序实现V2.0

  有天,跟XM合作的短信服务商突然提高了合作的价格,每条短信要多收1分钱。于是,部门经理当机立断:立即研发自有推送功能。除非客户所处的地区网络及其不好,否则,一律采用自有推送功能进行消息推送。

  接到这个需求之后,ABC便马不停蹄的开始工作了。不过,这次他们有点头疼了,因为他们之前的代码不仅在自己部门使用,而且在编辑部,运营部,人力资源部都有被使用。如果要修改,难道我要一个个去各个部门修改吗?怎么样使得此处的变化,产生最小的影响呢?这就是我们要研究的第二个问题。

  

白话控制反转IoC及其应用的更多相关文章

  1. 控制反转IoC简介

    控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...

  2. 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路

    开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...

  3. 控制反转IOC的依赖注入方式

    引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...

  4. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...

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

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

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

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

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

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

  8. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

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

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

随机推荐

  1. ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系

    ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY 是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景. ...

  2. React Native从零到一搭建开发环境

    React Native从零到一搭建开发环境 ReactNative环境搭建 安装Homebrew 安装rvm 安装nvm 安装node 安装react-native-cli 安装watchman i ...

  3. NodeJ node.js Jquery Ajax 跨域请求

    Jquery + Ajax 跨域请求 说白了就是前台请求ajax数据(JSON)但是请求的数据不在本地的绝对路径下,接口数据 是没有这个安全性的我对外公开的接口数据,只要你找到接口你就可以使用里面的数 ...

  4. SQL注入点的类型

    1.数字型注入点 形如“http://****?ID=55”,这类注入的参数是“数字”,因此称为“数字型注入点”. 此类注入点提交的SQL语句,其原形大致为:Select * from 表名 wher ...

  5. Java5~11新特性

    Java5~11版本新特性 Java5 Java6 Java7 Java8 Java9 Java10 Java11 Java5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性 ...

  6. linux下pip错误 ImportError: No module named 'pip_internal'

    wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate sudo python get-pip.py

  7. NPOI读取Excel遇到的坑

    NPOI是POI的.NET版本.POI是用Java写成的库,能帮助用户在没有安装Office环境下读取Office2003-2007文件.NPOI在.NET环境下使用,能读写Excel/Word文件. ...

  8. Ubuntu之C++开发环境的搭建

    初学Linux,今天反复卸载与重装微软商店的Ubuntu好几次,终于解锁了在Ubuntu上搭建C++开发环境的正确姿势, 搭建了一个非常简单的开发环境:简单到什么地步呢?只是简单地配置了一下编辑器,安 ...

  9. vue实现多级弹窗

    webpack + vue 实现 弹窗功能 对于刚入门webpack + vue 不久的新人来说,这技术,确实有些不太友好,相比较于直接操纵dom元素的jQuery,直接操纵数据的 vue 在webp ...

  10. PHP 中根据 IP 获取地址

    这里使用的是淘宝 IP 地址库提供的 API 接口. 淘宝 IP 地址库:http://ip.taobao.com/instructions.html API 文档说明:  使用事例: /** * 调 ...