出售域名 11365.com.cn
有需要请联系 16826375@qq.com
在手机上浏览
在手机上浏览

依赖注入模式

发布日期:2018-11-23

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

简单的说就是实现由外部提供,而当前类里只有定义。

using System;

namespace SinGooCMS.电脑
{
    /*
     * 依赖注入 指不依赖于细节,而依赖于抽象,依赖由外部产生
     * 主板提供了稳定的接口,并要求实现各自的功能。职责分工互不影响
     */

    public class 主板
    {
        private ICPU插槽 _cpu;
        private I内存插槽 _mem;
        private I硬盘插槽 _disk;
        private I显卡插槽 _vcard;
        private I外设插槽 _io;

        public 主板(ICPU插槽 cpu, I内存插槽 mem, I硬盘插槽 disk, I显卡插槽 vcard, I外设插槽 io)
        {
            this._cpu = cpu;
            this._mem = mem;
            this._disk = disk;
            this._vcard = vcard;
            this._io = io;
        }

        public virtual void 开机运行()
        {
            _cpu.提供运算();
            _mem.提供高速缓存();
            _disk.提供数据存储();
            _vcard.显示();
            _io.外设输入输出();
        }
    }

    public interface ICPU插槽
    {
        void 提供运算();
    }
    public interface I内存插槽
    {
        void 提供高速缓存();
    }
    public interface I硬盘插槽
    {
        void 提供数据存储();
    }
    public interface I显卡插槽
    {
        void 显示();
    }
    public interface I外设插槽
    {
        void 外设输入输出();
    }
}

具体实现由外部提供

public class 英特尔CPU : ICPU插槽
{
    public void 提供运算()
    {
        Console.Write("英特尔CPU正在运行");
    }
}
public class AMDCPU : ICPU插槽
{
    public void 提供运算()
    {
        Console.Write("AMD CPU正在运行");
    }
}
public class 三星内存条 : I内存插槽
{
    public void 提供高速缓存()
    {
        Console.Write("三星内存条提供高速缓存");
    }
}
public class 西部数据 : I硬盘插槽
{
    public void 提供数据存储()
    {
        Console.Write("西部数据500G");
    }
}
public class 金士顿固态256G : I硬盘插槽
{
    public void 提供数据存储()
    {
        Console.Write("金士顿固态256G");
    }
}
public class 七彩虹1050i : I显卡插槽
{
    public void 显示()
    {
        Console.Write("七彩虹1050i显卡");
    }
}
public class 双飞燕键鼠 : I外设插槽
{
    public void 外设输入输出()
    {
        Console.Write("双飞燕键鼠");
    }
}

 

class Program
{
    static void Main(string[] args)
    {
        主板 组装机 = new 主板(new 英特尔CPU(), new 三星内存条(), new 西部数据(), new 七彩虹1050i(), new 双飞燕键鼠());
        组装机.开机运行();

        Console.WriteLine();

        主板 华硕 = new 主板(new AMDCPU(), new 三星内存条(), new 金士顿固态256G(), new 七彩虹1050i(), new 双飞燕键鼠());
        华硕.开机运行();

        Console.WriteLine();
    }
}

最后实现的效果

示例下载

总结:应该依赖于抽象(接口),而不应该依赖于具体实现。所谓注入就是把具体的对象注入到所应用接口中,凡是实现接口的对象,都是可以被注入的!