• 依赖注入 IOC



    首先,明确下IoC是什么东西:

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。

    举例说明下,假设现在需要上层代码需要调用下面的数据库查询的代码,一般来说,我们第一个想到的就是,数据库封装成一个类,然后给出一个接口让上层应用调用,大致就是下面这个图(图是盗的.嘿嘿).

    这里写图片描述

    但是这样有一个问题就是,上层和底层耦合性太强,如果底层修改,那么会导致数据库实现类接口和上层应用也需要跟着修改.当然,有些人会说,我已经把数据库操作类给封装了,接口暴露出来的不变上层应用调用也不会改变,醒醒吧骚年!需求一改秒秒钟让你学会做人(底层改了,数据库实现逻辑改了怎么办)
    好了,现在IoC就出场了,IoC 一种重要的方式就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现,说人话就是,上层不再依赖下层的接口,而是将接口定义在上层,实现在底层:
    这里写图片描述

    好吧,还是借用上面博的代码来说明:

    做过电商网站的朋友都会面临这样一个问题:订单入库。假设系统设计初期,用的是SQL Server数据库。通常我们会定义一个SqlServerDal类,用于数据库的读写。

    public class SqlServerDal
    {
         public void Add()
        {
            Console.WriteLine("在数据库中添加一条订单!");
        }
    }

    然后我们定义一个Order类,负责订单的逻辑处理。由于订单要入库,需要依赖于数据库的操作。因此在Order类中,我们需要定义SqlServerDal类的变量并初始化。

    public class Order
    {
           private readonly SqlServerDal dal = new SqlServerDal();//添加一个私有变量保存数据库操作的对象
    
           public void Add()
           {
               dal.Add();
           }
    }

    最后,我们写一个控制台程序来检验成果。

        class Program
        {
            static void Main(string[] args)
            {
                Order order = new Order();
                order.Add();
    
                Console.Read();
            }
        }

    上面的代码就是使用依赖没有倒置的方式实现,但是代码耦合性太大,一旦需求修改就会要大改动.

    Created with Raphaël 2.1.0外部Order实现数据库操作

    下面代码是利用了依赖注入实现的IoC

        class Program
        {
            static void Main(string[] args)
            {
                SqlServerDal dal = new SqlServerDal();//在外部创建依赖对象
                Order order = new Order(dal);//通过构造函数注入依赖
                order.Add();
                Console.Read();
            }
        }
    
        public class Order
        {
            private IDataAccess _ida;//定义一个私有变量保存抽象
    
            //构造函数注入
            public Order(IDataAccess ida)
            {
                _ida = ida;//传递依赖
            }
    
            public void Add()
            {
                _ida.Add();
            }
        }
    
        public interface IDataAccess
        {
            void Add();
        }
    
        public class SqlServerDal : IDataAccess
        {
            public void Add()
            {
                Console.WriteLine("在数据库中添加一条订单!");
            }
        }


    这段代码用依赖注入(DI)的方式实现了IoC,简单的说就是,

    • 首先,定义SqlServerDal的抽象类型IDataAccess,并在IDataAccess接口中声明一个Add方法.

    • 然后,定义SqlServerDal类,实现IDataAccess接口的add方法

    • 最后,定义Order类,这个类实现了构造函数注入

     原文出处:http://blog.csdn.net/baidu_31981559/article/details/51578995

  • 相关阅读:
    测试思想-流程规范 关于预发布环境的一些看法
    Jenkins 开启用户注册机制及用户权限设置
    Jenkins 利用Dashboard View插件管理任务视图
    Loadrunner 脚本开发-从文件读取数据并参数化
    SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介
    测试思想-流程规范 SVN代码管理与版本控制
    Python 关于Python函数参数传递方式的一点探索
    接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]
    Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
    lintcode :链表插入排序
  • 原文地址:https://www.cnblogs.com/sunzhao/p/8333912.html
Copyright © 2020-2023  润新知