what is ioc:

控制注入,是一种设计模式

the benefits of using this:

降低耦合度

什么是DI

什么是依赖?

当一个类需要另一个类协作来完成工作的时候就产生了依赖

例如:在日志处理类中,需要将日志写入数据库,这是就需要一个写入数据库的相关类,从而就产生了依赖

按照抽象设计:
LogContext -> IWriteLog -> WriteDbLog 什么是注入?
依旧是上面那个例子,既然产生了依赖,就需要获得这个依赖的对象 step1:在LogContext定义一个 IWriteLog 的属性
step2: 在构造函数中直接实例化这个属性 -
考虑到业务变动,你不应该自己创建它而是应该由你的调用者给你
(2) step2:在构造函数中定义相应的参数,让调用者传入
把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。 什么是反转?
本应该由LogContext控制依赖的实现,但却由调用者注入,就产生了反转 什么是容器?
为什么要用容器?
上面这种情况控制是反转了,依赖的创建也移交到了外部。
但若是程序中存在100个这种地方,岂不是在100个地方进行注入,依赖太多,也不便于进行管理 所以需要一个地方统一管理系统中所有的依赖,这便是容器的诞生 容器负责两件事情:
• 绑定服务与实例之间的关系
• 获取实例,并对实例进行管理(创建与销毁) 为什么要使用DI?
以上例为说明
不使用DI时:
1.增加耦合度,日志的处理在日志中写入,当需要写入数据库时,会增加数据库相关的依赖,当写入磁盘时,又会增加磁盘的相关依赖
2.增加维护成本,当一个类的内容涉及过广时,很难察觉到真正需要关注的地方。
使用DI时:
1.降低耦合,一层依赖(抽象依赖),简单易用,降低耦合
2.降低维护成本,调整写入数据库逻辑,便只需要关注写入数据库的内容,调整写入磁盘也是如此
3.便于扩展,当调整写入缓存时,只需外部更改注入类,无效考虑日志处理类的做法

for example:

图解

常见场景

request --> UI层 --> response

小型UI层:
获取dal/dbcontext
执行操作 三层UI业务:
获取 service
获取service关联的dal
执行操作 多层业务:
获取 service
获取上述关联层实例
获取上述关联层实例
获取上述关联层实例...
执行操作

flow

未使用IOC vs 使用了IOC

<IOC>
1. UI只与容器关联
2. 容器与对象之间通过标识关联(通常是泛型type+抽象)
3. 业务调整时,无需考虑相关层的业务关系,只需维护本层业务
4. 当业务内容过多时,可以自行建立层级标准来维护标识的准确性
5. 简单易用,无需考虑过多元素 <无IOC时>
1. UI与最低层关联
2. 最低层与上层层层关联
3. 业务调整时,应考虑相关层的使用
4. 当业务内容过多时,阅读业务含义需要访问所有关联层方可理解
5. 复杂关联,容易出现代码重复,即便抽象也难以维护。。。

emm... 总结太多了,熟悉得不能再熟悉了。


author:monster

since:12/11/2018 3:26:09 PM

direction:ioc

IOC简洁说明的更多相关文章

  1. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  2. 轻松理解spring IOC

    spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 ...

  3. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  4. EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口

    回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepo ...

  5. 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...

  6. Spring的IOC逐层深入——依赖注入的两种实现类型

    构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...

  7. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

  8. 对Spring IoC容器实现的结构分析

    本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...

  9. IOC框架Ninject实践总结

    原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...

随机推荐

  1. 跟着太白老师学python day11 闭包 及在爬虫中的基本使用

    闭包的基本概念: 闭包 内层函数对外层函数的变量(不包括全局变量)的引用,并返回,这样就形成了闭包 闭包的作用:当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,如果这个函数内部形成了闭包, 那 ...

  2. JDK动态代理,此次之后,永生难忘

    出自:http://www.cnblogs.com/dreamroute/p/5273888.html#3839242 首先感谢"神一样的存在"的文章! 动态代理,这个词在Java ...

  3. java第三方类库实现图片等比缩放

    public class ThumbnailTest { public static void main(String[] args) { InputStream is = null; try { / ...

  4. Zabbix Proxy 分布式监控

    简介: Zabbix 是一个分布式监控系统,它可以以一个中心点.多个分节点的模式运行,使用 proxy 能降低 Zabbix Server 的压力,当然也带来了成本~ 适用范围:跨机房.跨地域的网络监 ...

  5. Simple Cubemap Reflection

    [Simple Cubemap Reflection] Cubemap加在MainTex上,所以Property需要按如下定义: 注意_Cubemap的类型是CUBE. 使用Cubemap,需要计算反 ...

  6. C++11之 auto

    [C++11类型推导] 1.使用auto的时候,编译器根据上下文情况,确定auto变量的真正类型.auto在C++14中可以作为函数的返回值,因此auto AddTest(int a, int b)的 ...

  7. Apache Hive (四)Hive的连接3种连接方式

    转自:https://www.cnblogs.com/qingyunzong/p/8715925.html 一.CLI连接 进入到 bin 目录下,直接输入命令: [hadoop@hadoop3 ~] ...

  8. cocos2dx 触摸屏的使用

    只要继承与CCLayer的类都可以实现触摸功能.CCLayer类的触摸事件的一些接口如下: // 单点触碰 virtual bool ccTouchBegan(CCTouch *pTouch, CCE ...

  9. 监控windows

    一.zabbix server和zabbix agent(windows)的地址说明 zabbix server的ip为:192.168.1.106 zabbix agent的ip为:192.168. ...

  10. Solidity oraclize解析Json格式数据

    solidity虽然不能解析json数据但是oraclize_query可以直接处理: pragma solidity ^; import "github.com/oraclize/ethe ...