.Net Core 3.1浏览器后端服务(四) 你眼中的依赖注入与我相同吗?
一、前言
DI—Dependency Injection 依赖注入
IoC—Inversion of Control 控制反转
近几年这依赖注入、 控制反转已成为软件开发中不可或缺的一部分,那么该怎么理解这两个概念呢?
在阅读开始之前,大脑中先闪现几个问号???

二、依赖注入
既然概念叫依赖注入,那首先分析一下什么是”依赖“?
依赖:是指一种特定的需求状态,在面向对象的软件开发过程中可以理解为对象A对另一对象B的一种引用关系。
下面以杀手刺杀举例说明依赖的关系:


杀手需要一把枪来执行刺杀计划,这里从杀手的角度来看,对枪存在一种依赖关系,没有枪就不能成功刺杀。代码中表示如下:
public class Killer
{
Gun gun = new Gun();
}
杀手只是需要一把枪,至于枪是如何生产的,杀手并不关心,我们改写下代码如下:
public class Killer
{
private Gun _gun;
public Killer(Gun gun)
{
_gun = gun;
}
}
接着我们在Main方法中看下:

Killer的构造方法中需要Gun,我需要你。。。,即是我(Killer)对你(Gun)有所依赖,这就是依赖。
那什么是依赖注入呢?既然杀手需要一把枪,那么Main方法就提供一个Gun对象并赋予给Killer,代码如下:
public class Program
{
static void Main(string[] args)
{
Gun gun = new Gun();
Killer killer = new Killer(gun);
}
}
在我看来Main方法赋予给杀手gun对象的”过程“,即把你所需要的赋给你的”过程“这就是依赖注入。
了解了什么是依赖注入?那它有什么好处呢?亦或者说依赖注入的目的是什么?

在网上查找依赖注入概念时,控制反转往往与其同时出现。那么好,我们先来看看控制反转
三、控制反转
既然叫控制反转,那一定存在正向的了,那么什么算是正向的呢?
还是以杀手为例,
public Killer()
{
Gun gun = new Gun();//创造一把枪
}
杀手自己创造一把枪,也就是自动去new即是正向。
知道了正向,那么反向就不难理解了,杀手本身不去new,被动获取即是反向。那何来控制一说呢?
好我们继续看,先正向看,杀手创造一把枪(获取枪消耗时间,存在风险,可能错过最佳行刺时间)然后去刺杀,刺杀完成后还要销毁枪(销毁枪消耗时间,这个时间可能被抓,风险太大)。
public Killer()
{
Gun gun = new Gun();//创造一把枪
gun.Kill();//去行刺
gun.Dispose();//销毁枪
}
既然创造枪和销毁枪都有风险,和不将这两部分交给其他人去做?下面反向来了
杀手在整个刺杀行动中,首先会有专人给杀手枪(这个过程就是依赖注入),杀手完成刺杀行动后,会有专人进行枪的善后处理。
即把枪除了刺杀之外的整个枪的使用过程的控制权完全交给第三方。

总结一下:这里的使用过程即可理解为对象(枪)的生命周期,第三方即是容器。容器接管了对象的创建、销毁的控制权。容器通过查找相关依赖动态的将对象(枪)注入给需求方(杀手)。
这种自身并不负责依赖对象的创建及销毁。由容器来管理控制的思想称之为控制反转。
这里可以回答上面遗留的问题,依赖注入的目的是什么?目的是实现控制反转。
四、.net core中使用依赖注入
了解了依赖注入和控制反转后,来看看.net core中在哪里进行的依赖注入,接下来回归我们的项目
1、.net core自身的IOC容器
NET Core自身集成了一个轻量级的IOC容器,只要在Startup.cs的ConfigureServices方法中进行配置即可,如之前配置的用户信息服务
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IUserInfoRepository, UserInfoRepository>();
services.AddScoped<IUserInfoServices, UserInfoServices>();
}
这里需要注意一点,配置注入的生命周期。有三种注入的生命周期
AddSingleton 单一实例对象整个程序运行期间都是相同的(相当于单例模式,例如:全局配置信息,统计在线人数)
AddScoped 对每次请求而言对象是相同的,但在请求之间不同(例如:获取用户信息,每个用户均请求自身的对象)
AddTransient 每次请求对象都是不同的(暂未找到合适的应用场景,如有合适的请告知)
.Net Core自身的IOC容器比较简单,如果想要更多的功能和扩展,还需要第三方的框架支持。
2、第三方IOC容器
.Net Core 有多种三方容器 如:Autofac、DryIoc、Grace、lightInject等等。评价较好的是Autofac,我们这里也使用Autofac
在 Package Manager Console中输入如下命令,安装Autofac包
Install-Package Autofac -Version 6.1.0
Install-Package Autofac.Extensions.DependencyInjection -Version 7.1.0
替换默认的IOC容器,在Program类中的CreateHostBuilder方法中 将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在Startup类中添加如下方法:
public void ConfigureContainer(ContainerBuilder builder)
{
var basePath = AppContext.BaseDirectory;
//Service所在程序集
string servicePath = Path.Combine(basePath, "MServices.dll");
Assembly serviceDll = Assembly.LoadFrom(servicePath);
//Repository层所在程序集
string repositoryPath = Path.Combine(basePath, "MRepository.dll");
Assembly repositoryDll = Assembly.LoadFrom(repositoryPath); builder.RegisterAssemblyTypes(serviceDll)
.AsImplementedInterfaces()
.InstancePerDependency();
builder.RegisterAssemblyTypes(repositoryDll)
.AsImplementedInterfaces()
.InstancePerDependency();
}
移除之前ConfigureServices中的注入
services.AddScoped<IUserInfoRepository, UserInfoRepository>();
services.AddScoped<IUserInfoServices, UserInfoServices>();
运行项目,并调用接口,调用正常,说明Autofac配置成功

五、结语
本文以杀手行刺为例简单说明了依赖注入、控制反转、IOC容器的概念及其联系。如有不正之处,请指正,感谢!
代码地址:https://gitee.com/sirius_machao/mweb-api
.Net Core 3.1浏览器后端服务(四) 你眼中的依赖注入与我相同吗?的更多相关文章
- .Net Core 3.1浏览器后端服务(一) Web API项目搭建
一.前言 基于CefSharp开发的浏览器项目已有一段时间,考虑到后期数据维护需要Server端来管理,故开启新篇章搭建浏览器后端服务.该项目前期以梳理服务端知识为主,后期将配合CefSharp浏览器 ...
- .Net Core 3.1浏览器后端服务(五) 引入定时任务Quartz.Net
一.前言 近期项目中遇到一些需求,需要定时写入数据库,定时刷新缓存的问题,因此需要引入任务调度机制. 我的选择是使用 Quartz.Net,使用的版本是 3.2.4 这里强调一点:3.x的版本与2.x ...
- .Net Core 3.1浏览器后端服务(三) Swagger引入与应用
一.前言 前后端分离的软件开发方式已逐步成为互联网项目开发的业界标准,前后端分离带来了诸多好处的同时,也带来了一些弊端. 接口文档的维护就是其中之一,起初前后端约定文档规范,开发的很愉快,随着时间推移 ...
- (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架
创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成
Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法.对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨 ...
- ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)
在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了.博客也就停了一下下. 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同 ...
- ASP.NET Core快速入门学习笔记(第3章:依赖注入)
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务16:介绍 1.依赖注入概念详解 从UML和软件建模来理解 从单元测试来理 ...
- Spring 学习笔记(四)—— XML配置依赖注入
依赖注入(DI)与控制反转(IoC)是同一个概念,都是为了处理对象间的依赖关系. 通过DI/IoC容器,相互依赖的对象由容器负责创建和装配,而不是在代码中完成. Spring支持通过setter方法和 ...
随机推荐
- The 2019 Asia Nanchang First Round Online Programming Contest C. Hello 2019(动态dp)
题意:要找到一个字符串里面存在子序列9102 而不存在8102 输出最小修改次数 思路:对于单次询问 我们可以直接区间dpOn求出最小修改次数 但是对于多次询问 我在大部分题解看到的解释一般是用线段树 ...
- Codeforces Round #676 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1421 A. XORwice 题意 给出两个正整数 \(a.b\),计算 \((a \oplus x) + (b \oplus ...
- python实现通过指定浏览器免费观看vip视频
程序是先通过一个解析视频的网站,然后我们提取其接口,然后实现观看vip视频的目的 所以说免费观看视频python程序很容易,但是下载视频就有些许麻烦了,下载视频请见我另一篇博客:python+fidd ...
- Educational Codeforces Round 89 (Rated for Div. 2) A Shovels and Swords B、Shuffle
题目链接:A.Shovels and Swords 题意: 你需要一个木棍和两个钻石可以造出来一把剑 你需要两个木棍和一个钻石可以造出来一把铁锹 你现在有a个木棍,b个钻石,问你最多可以造出来几件东西 ...
- AtCoder AIsing Programming Contest 2020 D - Anything Goes to Zero (二进制,模拟)
题意:给你一个长度为\(n\)的\(01\)串,从高位到低位遍历,对该位取反,用得到的十进制数\(mod\)所有位上\(1\)的个数,不断循环直到为\(0\),输出每次遍历时循环的次数. 题解:根据题 ...
- 实战交付一套dubbo微服务到k8s集群(8)之configmap使用
使用ConfigMap管理应用配置 拆分环境 主机名 角色 IP地址 mfyxw10.mfyxw.com zk1.od.com(Test环境) 192.168.80.10 mfyxw20.mfyxw. ...
- 【原创】docker & kubernetes问题总结
1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...
- 牛年 dotnet云原生技术趋势
首先祝大家:新年快乐,牛年大吉,牛年发发发! 2020年的春节,新冠疫情使得全球业务停滞不前,那时候,没有人知道会发生什么,因此会议被取消,合同被搁置,项目被推迟,一切似乎都停止了.但是我们却见证了I ...
- PyQt5 问题集
PyQt5中遇到的一些问题 1.多线程中界面异步刷新 我这里需要给界面动态添加新的控件,但是多线程中似乎并不能直接更新页面? 对于逻辑和界面分离的情况,使用自定义信号的方式进行页面控件的动态添加.注意 ...
- 计算机网络 part1 TCP
一.TCP协议 references:newcoder TCP/IP协议,TCP和UDP的区别及特点 1.四层模型 应用层:载有应用程序,将数据发送给传输层.主要协议有HTTP.SMTP.FTP.DN ...