首先,明确下IoC是什么东西:

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

举例说明下,假设现在需要上层代码需要调用下面的数据库查询的代码,一般来说,我们第一个想到的就是,数据库封装成一个类,然后给出一个接口让上层应用调用,大致就是下面这个图(图是盗的.嘿嘿).

但是这样有一个问题就是,上层和底层耦合性太强,如果底层修改,那么会导致数据库实现类接口和上层应用也需要跟着修改.当然,有些人会说,我已经把数据库操作类给封装了,接口暴露出来的不变上层应用调用也不会改变,醒醒吧骚年!需求一改秒秒钟让你学会做人(底层改了,数据库实现逻辑改了怎么办)
好了,现在IoC就出场了,IoC 一种重要的方式就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现,说人话就是,上层不再依赖下层的接口,而是将接口定义在上层,实现在底层:

好吧,还是借用上面博的代码来说明:

做过电商网站的朋友都会面临这样一个问题:订单入库。假设系统设计初期,用的是SQL Server数据库。通常我们会定义一个SqlServerDal类,用于数据库的读写。

public class SqlServerDal
{
public void Add()
{
Console.WriteLine("在数据库中添加一条订单!");
}
}

然后我们定义一个Order类,负责订单的逻辑处理。由于订单要入库,需要依赖于数据库的操作。因此在Order类中,我们需要定义SqlServerDal类的变量并初始化。

public class Order
{
private readonly SqlServerDal dal = new SqlServerDal();//添加一个私有变量保存数据库操作的对象 public void Add()
{
dal.Add();
}
}

最后,我们写一个控制台程序来检验成果。

    class Program
{
static void Main(string[] args)
{
Order order = new Order();
order.Add(); Console.Read();
}
}

上面的代码就是使用依赖没有倒置的方式实现,但是代码耦合性太大,一旦需求修改就会要大改动.

Created with Raphaël 2.1.0外部Order实现数据库操作

下面代码是利用了依赖注入实现的IoC

    class Program
{
static void Main(string[] args)
{
SqlServerDal dal = new SqlServerDal();//在外部创建依赖对象
Order order = new Order(dal);//通过构造函数注入依赖
order.Add();
Console.Read();
}
} public class Order
{
private IDataAccess _ida;//定义一个私有变量保存抽象 //构造函数注入
public Order(IDataAccess ida)
{
_ida = ida;//传递依赖
} public void Add()
{
_ida.Add();
}
} public interface IDataAccess
{
void Add();
} public class SqlServerDal : IDataAccess
{
public void Add()
{
Console.WriteLine("在数据库中添加一条订单!");
}
}

这段代码用依赖注入(DI)的方式实现了IoC,简单的说就是,

  • 首先,定义SqlServerDal的抽象类型IDataAccess,并在IDataAccess接口中声明一个Add方法.

  • 然后,定义SqlServerDal类,实现IDataAccess接口的add方法

  • 最后,定义Order类,这个类实现了构造函数注入

原文出处:http://blog.csdn.net/baidu_31981559/article/details/51578995

依赖注入 IOC的更多相关文章

  1. android使用篇(四) 注解依赖注入IOC实现绑定控件

    在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而 ...

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

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

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

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

  4. 关于依赖注入IOC/DI的感想

    之前一直不明白依赖注入有什么好处,甚至觉得它是鸡肋,现在想想,当时真是可笑. 这个想法正如同说接口是没有用处一样. 当整个项目非常庞大,各个方法之间的调用非常复杂,那么,可以想象一下,假设说没有任何的 ...

  5. DI依赖注入/IOC控制反转

    DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...

  6. Spring控制反转与依赖注入(IOC、DI)

    IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...

  7. TypeC一个微软开发的超简单.NET依赖注入/IoC容器

    控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...

  8. C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)

    通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...

  9. 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

      转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...

  10. 大话DI依赖注入+IOC控制反转(一) 之 定义

    转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转      依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...

随机推荐

  1. HTML基本内容

    设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...

  2. java根据URL获取HTML内容

    之前我写脚本,是想获取HTML内容的. 但是呢...一方面编码困扰着我,于是我写了这个: java根据URL获取网页编码 然后呢,每个网站是不是GZIP还得判断,贼麻烦... 但是没办法啊,麻烦也得写 ...

  3. SpringMVC+fastjson项目配置

    首先这个项目得是maven项目,不是maven项目的自己引包,我就不多说了. <!-- https://mvnrepository.com/artifact/org.springframewor ...

  4. Codeforces 600E. Lomsat gelral(Dsu on tree学习)

    题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...

  5. 【二十二】mysqli事务处理与预处理总结

    事务处理 事务基本原理 如果不开启事务,执行一条sql,马上会持久化数据.可见:默认的mysql对sql语句的执行是自动提交的! 如果开启了事务,就是关闭了自动提交的功能,改成了commit执行自动提 ...

  6. java递归 处理权限管理菜单树或分类

    1.数据库表设计 2.实体类设计 package com.ieou.capsule.dto.SystemPermissions; import java.util.List; /** * 功能菜单类 ...

  7. vue 父组件调用子组件方法

    情景: 父组件中引入上传附件的子组件:点击组件可以分别上传对应要求的图片,子组件内部循环可创建多个模块. 父组件传入数组子组件循环来创建不同的组件模块,所有事件都在子组件内部. 父组件页面的上方同时有 ...

  8. leecode第一百四十二题(环形链表II)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  9. 修改TP5中common模块默认不能使用问题

    在TP5框架中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承.其实是可以访问common模块的, 只需要把convention.php文件中的 / ...

  10. HAL无阻塞延时

    //实现间隔time_interval时间点亮红灯(此时间间隔并不是绝对的,是大于等于的关系)//用于系统要求无延时且延时时间粗略的场合,比如间隔一段时间采样数据,间隔一段时间点亮状态灯等//HAL_ ...