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代码实现并行(转)

    教你用一行Python代码实现并行 本文教你通过一行Python实现并行化. Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题. ...

  2. @RestController使用 接收jso参数 将参数转换为对象

    package com.monitor.controller; import org.springframework.http.ResponseEntity; import org.springfra ...

  3. mybatis 用法分享

    主题 这篇文章主要是记录这2个月我对mybatis的学习以后的一些感触和一些如果我是架构师会怎么在项目里使用mybatis的一些大胆的想法. 感想 1.首先根据之前的学习我已经知道了mybatis g ...

  4. 【转】Unity3d:读取FBX中的动画

    从模型中获得切割好的动画clip,并且对其中设置好的动画事件进行修改方法: 1.动画模型后缀为.FBX.在Unity3d中,能够显示FBX中的动画.要加载模型中的AnimationClip,只要Ass ...

  5. Asp.net 使用Neatupload 第三方控件上传大文件,在IIS7上无法正常工作解决

    使用环境:Window Server2008 + IIS7 更改web.config配置 1.在<configSections></configSections>节内加入: & ...

  6. Java网络编程小结 URLConnection协议处理器

    URL和URLConnection类 网络中的URL(Uniform Resource Locator)是统一资源定位符的简称.它表示Internet上某一资源的地址.通过URL我们可以访问Inter ...

  7. Oracle-属性查询

    1. 查询表的部分字段属性 select t.*, c.comments from user_tab_columns t, user_col_comments c where t.table_name ...

  8. ubuntu14.04 64位安装 g2o

    参考链接:http://blog.csdn.net/jiujiu932/article/details/52248577 http://www.cnblogs.com/gaoxiang12/p/473 ...

  9. 解决T4模板的程序集引用的五种方案

    在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种.关于T4的基本概念和模板结果,可以参考我的文章<基于T4的代码生成方式>.如 ...

  10. code1085 数字游戏

    划分dp 把环变链(读入4 3 -1 2变成4 3 -1 2 4 3 -1 2) 设dp[i][j][k]为把i~j分成k份,各部分内的数字相加,相加所得的k个结果对10取模后再相乘,最终得到的一个数 ...