基础_DIP>IOC>DI 急速简单认知控制反转,其实真的很简单

suixinsuoyu 2020-04-29

概念:

DIP(依赖倒置原则):软件在进行架构设计的时候的一种原则

高层定义接口,底层负责实现    ATM机(高层)  银行卡(底层)  ATM定义一个插卡口(接口),不管是哪家银行的卡,都可以进行取钱

IOC(控制反转):DIP的具体实现方式     如果没有插卡口 那么 中国银行的卡只能用中国银行的ATM 现在把他们的依赖抽出来 放到插卡口 那么 银行卡 ATM都只依赖第三方插卡口

DI(依赖注入):IOC的一种实现方式

拿用户类插入数据库业务举列:   

namespace IOC示例
{
    class Program
    {
        static void Main(string[] args)
        {      //此时sql如果想换成oracle 是不是很麻烦,如果是正常的程序再跑的话   得新增一个oracle插入到数据库的类,然后更改user里面的方法
            user user = new user();
            user.name = "名字";
            user.Add();
        }
    }

    public class SqlServerDal
    {
        //具体实现
        public void insert() { Console.Write("将用户插入到数据库"); }
    }
    public class user
    {
        private readonly SqlServerDal dal = new SqlServerDal();//添加一个私有变量保存数据库操作的对象

        public void Add()
        {
            dal.insert();
        }
        public string name { get; set; }
      
    }
}

 通过构造函数注入,进行解耦

using System;
namespace IOC示例
{
    class Program
    {
        static void Main(string[] args)
        {
            //此时 sqlservice 和user 已经进行了解耦
            SqlServerDal sqlDal = new SqlServerDal();//在外部创建依赖对象
            user user = new user(sqlDal);//通过构造函数注入依赖


            //BOSS说要换成oracle
            oracle oracleDal = new oracle();//在外部创建依赖对象
            user userOracle = new user(oracleDal);//通过构造函数注入依赖

            //发现没有改造只需要改造 oracle, user是完全不用动的 后面要换成任何数据库都行,不会牵扯大的改造

            user.Add();
        }
    }
    #region 定义抽象
    public interface IdataBase
    {
        void Add();
    }
    #endregion

    #region 数据库
    public class SqlServerDal : IdataBase
    {
        //具体实现
        public void Add() { Console.Write("将用户插入到数据库"); }
    }

    public class oracle : IdataBase
    {
        public void Add() { Console.Write("将用户插入到数据库"); }
    }

    #endregion

    #region 用户类
    public class user
    {
        private IdataBase _ida;//定义一个私有变量保存抽象

        public user(IdataBase ida)
        {
            _ida = ida;
        }

        public void Add()
        {
            _ida.Add();
        }
        public string name { get; set; }
    }

    #endregion
}

IOC容器:依赖注入的框架 

IOC容器是啥,就是懒, 把依赖注入手动变成自动化,

       原先手动 然后用了 Spring.NET框架 Autofac框架  Ninject框架..等等等

using System;
using Ninject;//添加Ninjecty服务引用
namespace IOC示例
{

    class Program
    {
        static void Main(string[] args)
        {
            StandardKernel kernel = new StandardKernel();//创建Ioc容器
            kernel.Bind<IdataBase>().To<SqlServerDal>();//注册依赖
            user user = kernel.Get<user>();//获取目标对象
            user.Add();

            //看起来和手动没区别,但是正常项目中,手动第一效率低 自己创建和注入依赖,容易失误,相互依赖组件多的话,很容易出错
            
            Console.Read();
        }
    }
    #region 定义抽象
    public interface IdataBase
    {
        void Add();
    }
    #endregion

    #region 数据库
    public class SqlServerDal : IdataBase
    {
        //具体实现
        public void Add() { Console.Write("将用户插入到数据库"); }
    }

    public class oracle : IdataBase
    {
        public void Add() { Console.Write("将用户插入到数据库"); }
    }

    #endregion

    #region 用户类
    public class user
    {
        private IdataBase _ida;//定义一个私有变量保存抽象

        public user(IdataBase ida)
        {
            _ida = ida;
        }

        public void Add()
        {
            _ida.Add();
        }
        public string name { get; set; }
    }

    #endregion
}

 更完整详细参考例子:https://www.cnblogs.com/liuhaorain/p/3747470.html#!comments

相关推荐