【转】三、依赖注入是啊?

【转】三、依赖注入是啊?

 

接口

每当游说靠注入之前,先了解下啊是接口。

咱们于学编程的下都知晓,接口的有关规则:(来自百度百科)

    1. 接口是一个引用类型,通过接口可以实现多还继承。
  • 2.
    C#受接口的积极分子不能够有new、public、protected、internal、private等修饰符。
  • 3.
    接口中不得不声明”抽象”成员(所以未能够一直生同样步对接口进行实例化(即未可知运用new操作符声明一个接口的实例对
    象)),而无克声称共有的域或者个人的成员变量。
    1. 接口声明非包数据成员,只能分包方法、属性、事件、索引等成员。
  • 5.
    接口名称一般还坐“I”作为首字母(当然不这样声明也可以),这为是接口和相近的一个组别之一。
  • 6.
    接口成员的拜会级别是默认的(默看public),所以当宣称时无能够重为接口成员指定其他访问修饰符,否则
    编译器会报错。
  • 7.
    接口成员不可知出static、abstract、override、virtual修饰符,使用new修饰符不见面报错,但会于起警示说不欲重点字new。
  • 8.
    以声明接口成员的时候,不准为接口成员编写具体的不过实行代码,也就是说,只要以对接口进行宣示时指明接口的成员称以及参数就足以了。
  • 9.
    接口一旦受实现,实现类似必须贯彻接口中之有着成员,除非实现类似本身是纸上谈兵类(通过具体的但是实行代码实现接口抽象成员的操作)。

                         
                                                                       
                          

重重时刻看如此多的定义,也是云里雾里的。项目中的接口使用啊是按老代码依葫芦画瓢。如果是温馨练手的代码或者demo,也是从未有过下接口。(给好之假说就是,我只是做来小之事物,根本不怕不需利用接口一样可跑好溜啊。)

 

接口是呀?(说说自家要好之知,不自然对)

接口就是为更换一个或许过时或者失实的贯彻而备的。就想我们的电脑,里面就是各地都是接口。usb、内存条、硬盘、电池、键盘…等等都是来分别的接口。我们得以经过硬盘接口换个更怪之硬盘或者转移个再次快的固态硬盘。如果键盘坏了,也可以经键盘接口买个新的键盘换上去。这就是接口明显的利。接口也可知晓成大家的约定。约定了一定接口的尺寸功能等等。

 

那我们描绘代码也是千篇一律,在好几地方可能会见常转移,逻辑会经常修改的地方使用接口约定。下面我们就算就此硬盘的接口来做示范吧。

首先定义一个硬盘接口。(一个name属性,一个念一个状的艺术)

/// <summary>
/// 硬盘接口
/// </summary>
interface IHardDisk
{
    /// <summary>
    /// 硬盘的名字属性
    /// </summary>
    string name { get; }
    /// <summary>
    /// 读取数据方法
    /// </summary>
    void read();
    /// <summary>
    /// 写数据
    /// </summary>
    void write(string str);
}

接下来我们购买了一个200G的硬盘,它实现了地方的接口。

public class HardDisk200 : IHardDisk
{
    public string name
    {
        get
        {
            return "我是200G硬盘";
        }
    }

    public void read()
    {
        Console.WriteLine("我可以写入数据哦....");
    }

    public void write(string str)
    {
        Console.WriteLine(str);
    }

}

当计算机受到采用这硬盘。

static void Main(string[] args)
{
    //这里的h就是一个插在接口上的设备
    IHardDisk h = new HardDisk200();
    h.read();
    h.write(h.name + ",我可以写入数据哦");


    Console.ReadKey();
}

 

某天,我们发现是硬盘太小了,需要换个1T之。(那样我们好抱很多博的电影>_<),那么请吧。

public class HardDisk1T : IHardDisk
{
    public string name
    {
        get
        {
            return "我是1T硬盘";
        }
    } 
    public void read()
    {
        Console.WriteLine("我可以写入数据哦....");
    } 
    public void write(string str)
    {
        Console.WriteLine(str);
    }
}

接下来怎么使了?只要在电脑及之接口直接插上新的硬盘就ok了,其他的什么地方还无须转。

 

马上就是使接口的便宜。当有天我们发现电脑太慢了,我们得以打只固态硬盘,直接在接口使用的地方换上就好了,其他地方了无用修改。

这样,我们就是得以不同时期要不同情况下活更换继承实现了接口的外对象,而无用修改外地方的代码。

又或说,实现了这接口的配备就是是存储设备。(它肯定有怀为毫无疑问好储,也便是大势所趋得写副和朗诵来多少。)

 

赖注入

每当咱们了解了什么是接口之后,我们随后来说说今天要的主题吧。

或事先打例子入手,且是我们学了编程都清楚的例证,三交汇。(什么?你不了解什么是三叠?那你别看了,先补习了重新回复)

我们事先来形容单简单的老三层伪代码。

DAL:

 public class DALMsSqlHelper
 {
     public int add(string str)
     {
         //...省略具体实现
         return 1;
     }
     //...省略具体实现,如修改 删除 查询
 }

BLL:

public class BLLAddStudent
{
    DALMsSqlHelper mssql = null;
    public BLLAddStudent()
    {
        mssql = new DALMsSqlHelper();
    }
    public int addStudent()
    {
        string str = "";  //...省略具体实现
        return mssql.add(str);
    }
}

UI:

 public class UI
 {
     BLLAddStudent s = new BLLAddStudent();
     public UI()
     {
         s.addStudent();
     }
 }

应当说简单得无能够以简短的老三重叠。

虽当系就此了平等年以后,老板说:”听说oracle很牛逼,大商家还是用底oracle。咱们也换上吧。“。
好,那便变换吧。

DAL:

public class DALOracleSqlHelper
{
    public int addOracle(string str)
    {
        //...省略具体实现
        return 1;
    }
    //...省略具体实现,如修改 删除 查询
}

显然BLL也要是进行改动,因为BLL引用了DAL的查询类。

BLL:

public class BLLAddStudent
{
    DALOracleSqlHelper mssql = null;
    public BLLAddStudent()
    {
        mssql = new DALOracleSqlHelper();
    }
    public int addStudent()
    {
        string str = "";  //...省略具体实现
        return mssql.addOracle(str);
    }
}

无就是更换个数据库也?为何修改这么好,要是老板啊天又如换回oracle怎么处置?这得出彩想个办法。

先是,我们定义一个数目看的接口。

public interface ISqlHelper
{
    int add();

    //...省略具体实现,如修改 删除 查询

 }

DAL修改如下:

public class DALMsSqlHelper : ISqlHelper
{
    public int add(string str)
    {
        //...省略具体实现
        return 1;
    }
    //...省略具体实现,如修改 删除 查询
}

public class DALOracleSqlHelper : ISqlHelper
{
    public int addOracle(string str)
    {
        //...省略具体实现
        return 1;
    }
    //...省略具体实现,如修改 删除 查询

    public int add(string str)
    {
        //...省略具体实现
        return 1;
    }
}

BLL:

 public class BLLAddStudent
 {
     ISqlHelper mssql = null;
     public BLLAddStudent(ISqlHelper sqlhelper)
     {
         mssql = sqlhelper;
     }
     public int addStudent()
     {
         string str = "";  //...省略具体实现
         return mssql.add(str);
     }
 }

UI:

public class UI
{       
    public UI()
    {
        ISqlHelper sqlhelper = new DALOracleSqlHelper();
        BLLAddStudent s = new BLLAddStudent(sqlhelper);
        s.addStudent();
    }
}

如哪天老板又使换会mssql怎样处置。那么单纯要修改UI

 

再就是过同样年之后,因为商家不景气。所以又来求了。老板:”唉,算了。我们还是用mysql吧。免费的,为公司省点“。那么我们而比方改了。

第一用再行描绘个mysql的落实。

DAL:

public class DALMySqlHelper : ISqlHelper
{
    public int add(string str)
    {
        //...省略具体实现
        return 1;
    }
    //...省略具体实现,如修改 删除 查询
}

UI实现如下:

public class UI
{       
    public UI()
    {
        ISqlHelper sqlhelper = new DALMySqlHelper();
        BLLAddStudent s = new BLLAddStudent(sqlhelper);
        s.addStudent();
    }
}

咱们来没有起发现。我们只是以DAL新增了一个mysql的实现同改动了下UI层的接口构造。其中BLL我们历来就是从来不动它的。

不错,这样咱们尽管足以说这里的UI对于BLL来说即使是”依赖注入“,BLL对于UI来说就是”控制反转“。所以,我道指注入及控制反转是跟一个定义,只是立场不同。

 

地方,我们看到了虽然BLL层已经不待改就好激增一个数据源的访问。那么我们能够不克为无修改UI层呢?

此就是好用到我们上篇讲的照了。

 

接下来,不管老板想怎么折腾,我单需要修改配置文件就可以了。甚至还不用动代码。(如果欲新增一个数据源操作,也使还实现产,然后改改配置文件)。

 

正文为协同到《C#基础知识巩固系列》

发表评论

电子邮件地址不会被公开。 必填项已用*标注