控制反转/依赖注入简明教程

简介: 控制反转/依赖注入简明教程

在面向对象中IOC是一个重要的设计思想。这篇文章将带领大家快速掌握控制反转和依赖注入。


注:代码基于c#


零、Ioc

Ioc 英文是 Inversion of Control,中文是控制反转。所谓控制反转,就是A类中有对B类方法的调用,我们调用之前一般都会先new,这样就增加了类和类之间的耦合度。为了降低耦合度,将A类对B类的的控制权交给Ioc容器,让双方都依赖Ioc容器。


一、DI

DI 的英文是 Dependency Injection,中文是依赖注入。依赖注入是实现Ioc的一种方式,也是常用的方式。依赖注入的方式主要有三种:构造函数注入、接口注入属性注入。(因为这篇文章知识一个简单的入门,因此我们不讲解这三种注入)我们来通过一个例子,来看一下依赖注入的好处:


故事:小吴是一个公司的CEO,每天都需要司机开车送他上下班,开始他只有一个司机,每次司机生病,他就只能自己开车上下班。因此小吴设立了一个司机部门,部门中有多名司机,由司机部门给小吴指派司机。


分析:从上面的故事可以分析得出,刚开始小吴是依赖者,司机是被依赖者,小吴依赖于小刚。后来通过增加司机部门这个Ioc容器,

小吴和小刚之间的关系变为了,小吴依赖于司机部门。


我们通过代码看一下(这里使用到了 .NET 依赖注入容器 AutoFac):

static void Main(string[] args)
{
    //接小吴
    IContainer driverCont = DriverDepartment();
    //司机部门分配一个司机给CEO小吴
    CE0_Wu wu = driverCont.Resolve<CE0_Wu>();
    wu.Car();
    Console.Read();
}
/// <summary>
/// 司机部门
/// </summary>
/// <returns></returns>
private static IContainer DriverDepartment()
{
    ContainerBuilder builder = new ContainerBuilder();
    builder.RegisterType<CE0_Wu>();
    builder.RegisterType<Driver>().As<IDriver>();
    return builder.Build();
}
}
/// <summary>
/// 抽象以来
/// </summary>
public class Driver : IDriver
{
/// <summary>
/// 开车
/// </summary>
public void Drive()
{
    Console.WriteLine("开车送老板");
}
}
public interface IDriver
{
void Drive();
}
/// <summary>
/// 小吴
/// </summary>
public class CE0_Wu
{
private IDriver driver;
public CE0_Wu(IDriver driver)
{
    this.driver = driver;
}
public void Car()
{
    driver.Drive();
}
}
目录
相关文章
|
12月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
460 2
|
JavaScript
Nodejs的模块化概述
详细解释Node.js的模块化概念,包括CommonJS规范、模块的引用、定义、标识,以及如何在Node.js中实现模块化,并通过示例代码展示了如何创建和使用模块,以及"module.exports"和"exports"的区别。
143 1
Nodejs的模块化概述
|
Ubuntu Linux 数据库
如何在Ubuntu 16.04上安装和配置Postfix作为仅发送的SMTP服务器
如何在Ubuntu 16.04上安装和配置Postfix作为仅发送的SMTP服务器
148 0
|
存储 运维 Kubernetes
【K8S 核心架构原理】
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave 节点则执行用户的程序。
415 0
|
存储 算法 Java
计算图中两个顶点的所有路径,你会吗
计算图中两个顶点的所有路径,你会吗
412 0
计算图中两个顶点的所有路径,你会吗
|
JavaScript 前端开发 微服务
jeecg-boot中实现跳过登录验证访问其他vue页面
jeecg-boot中实现跳过登录验证访问其他vue页面
1250 0
jeecg-boot中实现跳过登录验证访问其他vue页面
|
负载均衡 Dubbo 安全
Dubbo学习总结
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
|
存储 安全 编译器
带领你打开C++的神秘之门--完结篇(中)
带领你打开C++的神秘之门--完结篇
208 0
|
前端开发 中间件
挑战21天手写前端框架 day7 使用 Socket 实现 esbuild 的热加载服务 hmr
挑战21天手写前端框架 day7 使用 Socket 实现 esbuild 的热加载服务 hmr
635 0
挑战21天手写前端框架 day7 使用 Socket 实现 esbuild 的热加载服务 hmr