ASP.NET Core6.0/8.0学习笔记(十)—依赖注入概述

一、依赖

1.什么是依赖:若在一个类A的成员中使用了另一个类B的对象,则称类B是A的依赖项。依赖项是指另一个对象所依赖的对象。
在这里插入图片描述

如上面的代码所示,NonQuerySql类、QuerySql类以及Procedure类都是DataHelper的依赖项
2.直接使用硬编码的依赖所存在的问题:
(1)若要使用不同的实现类替换NonQuerySql类,则DataHelper类也需要对应修改
(2)难以进行单元测试
3.我们需要达成的效果:
(1)将类的依赖进行抽象(如接口),则在依赖于该对象的类中只需要声明这个接口即可,具体实现交给对应的实现类;
(2)在外部提供服务类时只需要实现接口或约定,并专注于服务本身的逻辑即可;
(3)由外部控制对象的创建与回收
4.应用场景:假设你要编写一个类,这个类对外部的其他的很多类存在调用关系,而被它调用的类又对外依赖于其他的类。当某一天需求更改时,就需要改动很多类。这时我们就需要将这些类一一改写,十分麻烦。
依赖注入就是将依赖的类抽象出来,成为一个接口。称为服务。比如说我们需要发送一个消息,具体使用什么东西发送不重要,例如用微信/QQ发送,则这个具体的实现类型,我们只需要将这个类型注册进去即可。此时,应用关于“发送消息”这一动作的“控制”就从应用内转移到了应用外。这种转移称之为“控制反转”。

二、控制反转

1.控制反转(Inversion of Control,IOC)的引入:以用电为例:
(1)自己发电:所有事情都需要自己搞,包括采集燃料、建设发电机、搭接电线等
(2)接入电网:交钱,开开关,将发电的事情交给专业的机构做(发电厂),我们只需要提供电费就行了。
自己发电更复杂,但是可以自定义发电的各种参数据;接入电网简单方便,但是参数不能自定义
2.控制反转的开发方式:
传统方式:所有功能模块都由自己设计开发(正转),流程由应用进行控制
控制反转:有什么用什么,流程由对象提供者控制。
3.控制反转:什么是“控制”:IOC中的控制指的是关于“流程”的控制。更具体来说,在C#等“面向对象”的语言中,各种流程的目的都是为了创建一个“对象”或执行某些操作。而在IOC中所有的流程都是为了创建对象。例如:
我需要获取一个对象A,或者是完成某一个固定逻辑A,这个对象A的创建需要对象B、C、D、E的参与并调用对应的API来完成创建
(1)类库:直接提供对应的API,整个流程由程序员在自己的应用中手动编码完成,包括B、C、D、E对象的创建以及API的调用
(2)控制反转:程序员只需要声明“需要”一个A对象并准备好B、C、D、E,框架就会自动创建合适的对象。创建A的流程被封装在框架中
例如最常见的MVC框架,以ASP.NET Core MVC应用开发来说,我们只需要按照约定的规则(如约定的目录结构和文件与类型命名方式等)定义相应的Controller类型和View文件即可。ASP.NET MVC框架在处理请求的过程中会根据路由解析生成参数得到目标Controller的类型,然后自动创建Contro11er对象并执行。如果目标Action方法需要呈现一个View,框架就会根据预定义的目录约定找到对应的View文件(.cshtml文件),并对其实施动态编译以生成对应的类型。当目标View对象创建之后,它执行之后生成的HTML会作为响应回复给客户端。该框架处处体现了“框架Call应用”的特点。(来自蒋金楠:《ASP.NET Core 6.0框架揭秘》)
4.依赖注入是实现控制反转思想的主要实现方式,简化模块的组装过程,降低模块之间的耦合度
例:“自己发电”:连接数据库:
在这里插入图片描述

缺点:必须确定每一个步骤涉及的每一个元素
5.控制反转的目的:怎样创建XX对象——我需要XX对象
将对象的创建与管理完全交给第三方组件(框架),程序代码只需要表明需求即可,不需要自己手动去创建这个类型。

三、与IOC接近的两种设计模式

1.模板方法:将多个小的方法模块按照逻辑封装到一个大的方法中,同时提供重写便于定制(虚方法)
2.工厂方法:针对于流程的复用与定制可以通过创建型设计模式完成
3.抽象工厂
4.IOC容器与DI的关系:
(1)映射依赖,注册类型,注册服务
(2)实例解析
(3)DI是IOC的主要实现方式
5.优点:适用于模块化开发
6.IOC可以视为超级工厂(工厂设计模式),是依赖注入的核心对象。整个.NET Core框架都是建立在依赖 注入框架之上。.NET Core分为基础类库与扩展类库,扩展类库包括依赖注入框架等,依赖注入是扩展类库的基石。

四、对于依赖注入的理解

在以前的面向对象开发过程中,我们需要自己管理模型与业务代码,二者会产生一定程度的耦合甚至是强耦合,例如三层架构模式。而依赖注入则是对于模型与业务逻辑的解耦,使得模型与业务逻辑可以分开,独立进行开发。
在依赖注入中,对象的建立与管理将完全交由.NET Core框架。由框架负责对象的整个生命周期,包括创建、分发、使用以及销毁。程序员也从自己独立去new对象转变为对于对象的获取。框架会在代码运行时自动匹配合适的对象
最重要的不同:不需要程序员去手动管理各种对象,只要这个对象符合某个标准即可(比如说电压是220V),框架会自动给用户接入220V的电,而不用在接电时去关心这个电是怎么来的。只要提前准备好原材料(如电费、插座)就可以。
最终目的:进一步屏蔽对象的变化对于业务代码的影响,只要提供都是“同一套”对象(即实现了同一接口或者是实现了某一约定),都不需要修改业务代码

五、依赖注入在代码层面上的体现

1.依赖注入在代码层面上体现为:假设有A、B两个类,其中B类需要A类中的成员执行任务。则称A为B的“依赖”
2.在传统的开发中,程序员需要手动在B类中去 创建A的实例对象。但是现在B类中获取A的实例不再需要手动去创建,而是从外部直接给B类中传送入A对象。即“注入”A对象
3.“从外部注入”的流程需要一套格外的代码去实现,负责所有对象的整个生命流程。这样一套代码称为“依赖注入框架”。最常见的就是ASP.NET Core Web开发框架。
在这里插入图片描述

  • 31
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GISer_Qing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值