设计原则:依赖注入原则

依赖倒置原则,是一种程序设计模式的原则

高层模块不应该依赖底层模块,二者都应该依赖其抽象。

抽象不应该依赖细节,细节应该依赖抽象。依赖导致原则很好的体现了“面向接口编程”的思想。

Ioc容器是由依赖注入框架提供的,它是依赖注入框架中最主要的东西,它主要用来映射依赖管理对象创建和生存周期。

高耦合例子

这里是一个爸爸给孩子讲故事的例子,都是通过new来实例化类

 class Program
{
static void Main(string[] args)
{
Father father = new Father();
father.Read();
}
} public class Book
{
public string GetContent()
{
return "很久很久以前,有个人叫盘古";
}
} public class Father
{
public void Read()
{
Book book = new Book();
Console.WriteLine("爸爸开始讲故事了");
Console.WriteLine(book.GetContent());
}
}

突然有一天,孩子不想听故事了,想听报纸上的内容。这里有需要添加一个报纸类

  class Program
{
static void Main(string[] args)
{
Father father = new Father();
father.Read();
}
} public class Book
{
public string GetContent()
{
return "很久很久以前,有个人叫盘古";
}
} public class paper
{
public string GetContent()
{
return "报纸内容。。。。";
}
} public class Father
{
public void Read()
{
//Book book = new Book();
//Console.WriteLine("爸爸开始讲故事了");
//Console.WriteLine(book.GetContent()); paper paper = new paper();
Console.WriteLine("爸爸开始读报纸了");
Console.WriteLine(paper.GetContent());
}
}

这里发现 Father 被修改了,突然有一天小孩又想听看网页上的新闻。。。这里Father内容是不是又要修改了呢? 那肯定是的,这样Father会不断的被修改,耦合度太高,导致代码被频繁修改。这里能不能解耦呢?哎,那就用接口吧,降低耦合。来定义个接口

    public interface IReader
{
string GetContent();
}

解耦例子

让 Book和paper 继承 IReader

 class Program
{
static void Main(string[] args)
{
//先来读书
Father father = new Father(new Book());
father.Read();
}
} public interface IReader
{
string GetContent();
} public class Book:IReader
{
public string GetContent()
{
return "很久很久以前,有个人叫盘古";
}
} public class Paper : IReader
{
public string GetContent()
{
return "报纸内容。。。。";
}
} public class Father
{ public IReader Reader { get; set; }
//通过构造函数实例化接口
public Father(IReader reader) {
Reader = reader;
}
public void Read()
{
//Book book = new Book();
//Console.WriteLine("爸爸开始讲故事了");
//Console.WriteLine(book.GetContent()); //paper paper = new paper();
//Console.WriteLine("爸爸开始读报纸了");
//Console.WriteLine(paper.GetContent()); Console.WriteLine("爸爸开始了。。");
Console.WriteLine(Reader.GetContent()); }
}

在换一下Paper

 static void Main(string[] args)
{
//先来读书
Father father = new Father(new Paper());
father.Read();
}

这样就实现了解耦。不用频繁修复Father,而是在调用的时候,随便调用。

什么是依赖注入 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. MySQL同步故障:" Slave_SQL_Running:No" 两种解决办法

    进入slave服务器,运行: mysql> show slave status\G Relay_Log_File: localhost-relay-bin.000535 Relay_Log_Po ...

  2. 详解Apache服务与高级配置,(主配置文件每行都有描述)

    HTTP服务---> http://httpd.apache.org/(官方网站) httpd  service :纯粹的web服务器,同时开源(不是GPL). 特性:1.在进程特性上通常是事先 ...

  3. centos 6.5 忘记用户名和密码

    1,启动虚拟机,出现下面的倒计时界面时,按键盘上的e键 (说明:要确保光标此时已经在虚拟机内了,要不然,按了e键,也是在windows内,无效.e代表edit,启动前编辑) 2,进入如下后界面,再按e ...

  4. manager.add_command('runserver', Server('0.0.0.0', port='8093', extra_files=extra_files))

    extra_files: a list of files the reloader should watch                    additionally to the module ...

  5. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

  6. Graylog-centos安装

    graylog安装 1.先决条件 yum install java-1.8.0-openjdk-headless.x86_64 -y #安装java软件包 yum install epel-relea ...

  7. 证明StringBuffer线程安全,StringBuilder线程不安全

    证明StringBuffer线程安全,StringBuilder线程不安全证明StringBuffer线程安全StringBuilder线程不安全测试思想测试代码结果源码分析测试思想分别用1000个线 ...

  8. js原型结构图

    要素:对象原型.函数原型: [p]  原型对象: p    模版对象: 要构造的对象的信息: 构造函数具有原型对象和模版对象: 普通对象只具有模版对象: https://zhuanlan.zhihu. ...

  9. PHP:ThinkCMFX任意文件包含漏洞

    前言:最近爆出来的漏洞,ThinkCmfX版本应该是通杀的,基于3.X Thinkphp开发的 代码下载地址:https://gitee.com/thinkcmf/ThinkCMFX/releases ...

  10. ksh与bash的异同

    (1) 在ksh是,数组的index只能从0到1023,而bash中没有这样的限制. (2) ksh与bash初始化数组的语法不同: 如下所示 icymoon# ksh icymoon# set -A ...