什么是依赖注入 IoC
设计原则:依赖注入原则
依赖倒置原则,是一种程序设计模式的原则
高层模块不应该依赖底层模块,二者都应该依赖其抽象。
抽象不应该依赖细节,细节应该依赖抽象。依赖导致原则很好的体现了“面向接口编程”的思想。
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的更多相关文章
- android使用篇(四) 注解依赖注入IOC实现绑定控件
在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...
- 关于依赖注入IOC/DI的感想
之前一直不明白依赖注入有什么好处,甚至觉得它是鸡肋,现在想想,当时真是可笑. 这个想法正如同说接口是没有用处一样. 当整个项目非常庞大,各个方法之间的调用非常复杂,那么,可以想象一下,假设说没有任何的 ...
- DI依赖注入/IOC控制反转
DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- TypeC一个微软开发的超简单.NET依赖注入/IoC容器
控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...
- C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)
通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- 大话DI依赖注入+IOC控制反转(一) 之 定义
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转 依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...
随机推荐
- Httpd服务入门知识-Httpd服务常见配置案例之DSO( Dynamic Shared Object)加载动态模块配置
Httpd服务入门知识-Httpd服务常见配置案例之DSO( Dynamic Shared Object)加载动态模块配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.加载动 ...
- 最长上生子序列LIS
学习动态规划问题(DP问题)中,其中有一个知识点叫最长上升子序列(longest increasing subsequence),也可以叫最长非降序子序列,简称LIS.简单说一下自己的心得. 我们都 ...
- NEW jobs: A Prepare. Prepare. Prepare. 怎么准备都不过分
A Prepare. Prepare. Prepare. From: https://leetcode.com/explore/interview/card/leapai/272/general ...
- Bean property ‘mapperHelper’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
spring boot 报错: Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property ...
- CSS float 父元素高度自适应
<html> <head><title></title><style type="text/css">*{margin: ...
- 分析脚本搭建docker环境:python, R
1. 搭建Anaconda Python3.6 FROM nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04 MAINTAINER Tyan <tyan.liu.g ...
- docker 服务无法启动
重装以后仍然不行,dockerd可以运行,但是systemctl start docker.service不行,后来在编辑一个文件时,提示没有空间可以保存,结果一查,发现服务器空间基本占满了, 通过 ...
- Linux安全加固(二)禁止普通用户su到root/设置SSH终端接入白名单/修改history条数
一.禁止普通用户su到root管理员.设置可以su到root的白名单 1.首先看一下正常情况 2.可以看到普通用户使用su root命令,输入密码即可登录到root用户 3.下面开始配置禁止所有普通用 ...
- 在Visual Studio中调试时,如何检查有关进程令牌的详细信息?
从Visual Studio 2005开始,watch窗口获得了一个伪寄存器,用于调查有关进程令牌的详细信息.所以,你只要开始调试,在监视窗口中写下“$user”, 有时查看特权和组的扩展视图会很有趣 ...
- JS函数基础
一.函数 1.函数是什么 具有特定功能的n条语句的封装体. 只有函数是可执行的,其它类型的数据是不可执行的. 函数也是对象. 2.为什么要用函数 提高代码复用 便于阅读和交流 3.如何定义函数 函数声 ...