设计原则:依赖注入原则

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

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

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

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. java 时间格式

    自定义时间格式:yyyy 年MM 月dd 天HH 24小时制hh 12小时制mm 分钟ss 秒 java.util.Date日期格式为:年月日时分秒 java.sql.Date日期格式为:年月日jav ...

  2. Python 函数返回值类型

    [ i for i in dir(set) if not i.startswith('_') ]   

  3. linux初始化shell脚本

    #!/bin/bash # this is a init script ping -c 1 -i 0.1 -W 1 baidu.com a=`echo $?` if [ ${a} == 0 ];the ...

  4. python正则表达式(5)--findall、finditer方法

    findall方法 相比其他方法,findall方法有些特殊.它的作用是查找字符串中所有能匹配的字符串,并以结果存于列表中,然后返回该列表 注意: match 和 search 是匹配一次 finda ...

  5. python基础知识-列表的排序问题

    def main(): f=['orange','zoo','apple','internationalization','blueberry'] #python 内置的排序方式默认为升序(从小到大) ...

  6. 五个wordpress调用随机文章的方法

    分享几个WordPress不用插件调用随机文章的方法,不仅增强用户粘性,而且当蜘蛛来爬你的文章的时候每次都会有变化,搜索引擎很喜欢.主要用到的是orderby rand参数,下面就随ytkah一起来看 ...

  7. [译] 揭秘 iOS 布局

    翻译自:Demystifying iOS Layout 在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题.通常这种问题发生的原因就是对于 view 何时真正更新的错误理解.想理 ...

  8. React于React native的渲染机制

    面向virtual DOM编程 vs 面向native componet编程: 状态编程引起的UI变化会全部提交到native compnent然后走平台原来的渲染流程. The DOM is jus ...

  9. Increasing Performance by Reducing Dynamic Dispatch

    https://developer.apple.com/swift/blog/?id=39 Increasing Performance by Reducing Dynamic Dispatch Li ...

  10. 基本例程(4-1)手势识别C++ 和简单形状匹配

    扩展库https://blog.csdn.net/Taily_Duan/article/details/52130135 opencv3.3+扩展库 /************************ ...