zoukankan      html  css  js  c++  java
  • IOC简洁说明

    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

  • 相关阅读:
    Directx11 HelloWorld之DirectCompute
    TortoiseSVN使用简介
    图形学的坐标转换问题(局部到世界坐标系,世界到观察坐标系)
    Directx11中获取HLSL中变量一些问题
    Mathematics for Computer Graphics
    Nvidia给力 Android游戏革命来临 有能力超iPhone
    D3d10和D3d11中Map()函数用法一点心得总结
    GPU开始无处不在,加速火狐浏览器4.0
    Delphi多媒体设计之TMediaPlayer组件(四)
    Delphi多媒体设计之TMediaPlayer组件(一)
  • 原文地址:https://www.cnblogs.com/monster17/p/10423444.html
Copyright © 2011-2022 走看看