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. JavaScript 修改元素值

    document.getElementById('yybz').value=jsdata.toLocaleString(); document.getElementById('yybz').inner ...

  2. Windows Server 2003 简体中文企业版

    Windows Server 2003 简体中文企业版,真正免激活. CD-KEY:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY 安装序列号:JCGMJ-TC669-KCBG7-HB8X ...

  3. STL : List使用时应注意的问题

    这篇文章所述只是本人遇到的问题,仅供参考. #include<list> #include<iostream> using namespace std; class Foo { ...

  4. java css

    SS动画 http://daneden.github.io/animate.css

  5. 在SharePoint解决方案中使用JavaScript (0)

    随着Web前段技术(JavaScript/HTML5)的日益发扬光大,在Web应用程序中,我们开始更多的使用JavaScript.很多以往是放在服务器上运行的逻辑,现在都开始逐渐的向前段转移.这种趋势 ...

  6. 纸牌游戏CardBattle的设计与开发

  7. c# winform 解决PictureBox 无法打印全部图片的问题

    一.   问题描述 在页面使用PictureBox 加载资料图片后,点击“打印”,只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属 ...

  8. Listview getItemViewType的使用

    ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount 其中 getItemViewType返回的是有参数po ...

  9. 更改IDEA高亮字体背景颜色

    IDEA工具中依次进入file -> settings -> editor -> colors Scheme -> general,在右侧窗口中将result.i  都改成自己 ...

  10. 377. Combination Sum IV 返回符合目标和的组数

    [抄题]: Given an integer array with all positive numbers and no duplicates, find the number of possibl ...