依赖注入 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

原文地址:https://www.cnblogs.com/sunzhao/p/8333912.html