目录:

一、什么是依赖注入

1.1、什么是依赖?

1.2、 什么是注入?

1.3、依赖注入解决的问题

二、服务的生命周期(.Net Core DI)

三、替换默认服务容器

  3.1、为什么替换默认服务容器?

  3.2、如何替换服务容器


一、什么是依赖注入

1、 什么是依赖

Rely类

  public class Rely
{
public Task Test(string testMessage)
{
Console.WriteLine(testMessage);
return Task.FromResult();
}
  }

Output类

public class Output
{
Rely rely = new Rely();
public async Task Out()
{
await rely.Test("這是一個測試消息");
}
}

Output类需要Rely类来帮助它实现输出的功能,这样Output类对Rely类产生了依赖,可以理解为Output依赖于Rely

依赖的一个设计原则:依赖于抽象,而不是具体的实现,这个后面会具体解释的

2、 什么是注入

修改Output类

public class Output
{
private Rely _rely;
public Output(Rely rely)
{
_rely = rely;
}
public async Task Out()
{
await _rely.Test("這是一個測試消息");
}
}

在这里Output类不去实例化Rely类,而是通过其他人传递给我,我只用就好。到底怎么理解注入呢?

简单来说就是别人对依赖创建实例化,我自己只负责使用,别人创建好了给我使用,这么一个过程可以理解为注入

这里主要体现了控制反转 (IoC)的思想,什么是IOC ?我们看看下面的图就好理解了

直接依赖关系在运行的时候A调用B,B调用C,编译的时候A取决于B,B取决于C。

而在反转依赖关系中, A可以调用B实现的抽象上的方法,让A可以在运行时调用B,而B又在编译时依赖于A控制的接口,程序运行时流程跟直接依赖关系一样。但是插入了接口意味着可以轻松的有不同实现

 

3、 依赖注入解决的问题

依赖注入主要体现了IOC思想,IOC将实现详细信息编写为依赖并且实现了更高级的抽象,因此程序测试性,维护性,模块化程度都更高了。这也就对应了刚刚的那个设计规则--依赖于抽象,而不是具体的实现。

那么依赖注入到底解决了哪些问题呢?

问题一:在直接依赖关系中如果A类需要更换为其他实现,那么就必须得修改B类

问题二:如果有多个依赖B类的类,那么将会实例化多个配置,这样代码会比较分散和冗余

问题三:这种实现方法很难实现单元测试

解决这些问题的办法:

一:使用了接口抽象话依赖关系的实现,改动实现只需要改动注入的地方即可

二:注册服务容器中的依赖关系,有多处需要不许多出实例化配置,直接在Startup.ConfigureServices中注册即可

二、服务的生命周期(.Net Core DI)

在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。

    •   IServiceCollection---负责注册
    •   IServiceProvider---负责提供实例

 

Startup.csConfigureServices中注册服务

   public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//单例生存期 services.AddScoped<IHttpContextAccessor, HttpContextAccessor>();//范围生存期 services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();//暂时生存期 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

1、 Transient暂时生存期)--暂时生存期服务是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。

暂时生存期会在每次请求的时候创建一个实例

2、 Scoped范围生存期)--范围生存期服务是每个客户端连接时创建的一次实例

范围生存期会在客户端连接时创建一次实例,然后每次请求的实例都是相同的

3、 Singleton单例生存期)--单例生存期会在程序第一次请求是创建一次实例

单例生存期仅会在第一次连接时创建一次实例,所有整个程序使用的实例都是同一个实例

三、替换默认服务容器

1、 为什么替换默认服务容器

我们可以首先理解下什么是服务容器—依赖注入把依赖的创建给了别人,别人创建好了再给我们使用。那么在哪里创建依赖呢?或者说在那里管理依赖呢?这里就有了容器这个概念,负责管理系统中所有的依赖。

那么我们为什么要替换容器呢?

内置的服务容器足够实现一些小型的项目或满足大多数的消费者,但是遇到大型的项目就比较麻烦了,依赖较多,内置的服务容器就显得有点短板了。当我们遇到这些问题的时候就可以考虑替换默认服务容器。

2、 如何替换服务容器

这里我们说下替换服务容器为Autofac

安装适当的包

    •   Autofac
    •   Autofac.Extensions.DependencyInjection

在 Startup.ConfigureServices 中配置返回 为IServiceProvider:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Add other framework services
// Add Autofac
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterModule<DefaultModule>();
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return new AutofacServiceProvider(container); }

如果要使用第三方容器的话, Startup.ConfigureServices 必须返回 IServiceProvider。

然后我们在 DefaultModule 中配置 Autofac

public class DefaultModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<CharacterRepository>().As<ICharacterRepository>();
}
}

  欢迎大家扫描下方二维码,和我一起学习更多的知识

理解ASP.NET Core 依赖注入的更多相关文章

  1. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  2. 全面理解 ASP.NET Core 依赖注入 (转载)

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  3. 深入理解ASP.NET Core依赖注入

    概述        ASP.NET Core可以说是处处皆注入,本文从基础角度理解一下原生DI容器,及介绍下怎么使用并且如何替换官方提供的默认依赖注入容器. 什么是依赖注入        百度百科中对 ...

  4. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

  5. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  6. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  7. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  8. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  9. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

随机推荐

  1. C++负数取模

    预习: r=余数 a=被除数 b=除数 c=商 a/b=c........r r=a-(a/b)*b 一.下面的题目你能全做对吗?1.7/4=?2.7/(-4)=?3.7%4=?4.7%(-4)=?5 ...

  2. kaggle入门项目:Titanic存亡预测(四)模型拟合

    原kaggle比赛地址:https://www.kaggle.com/c/titanic 原kernel地址:A Data Science Framework: To Achieve 99% Accu ...

  3. 爬虫之proxy(代理)

    proxy简介 proxy即为代理,我们爬虫的时候肯定会有频繁访问某一网站的情况,这个时候有些服务器会识别到我们是非正常访问,就会把我们的IP禁掉,这个时候就需要用代理了. 就好比现实生活中,我需要向 ...

  4. php $_SERVER['HTTP_USER_AGENT'] 用法介绍

    在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息, 显示结果为: Mozilla/5.0 (Windows NT 6.1; WOW64) App ...

  5. python之字典、列表、元组生成器的使用

    python的生成式在一些类型相互转换的时候可以写出十分优雅的代码.如列表转换成另一个列表.字典.或元组.并且代码的执行效率也比使用for...in...循环高. 列表生成式 列表生成式即生成列表的生 ...

  6. Spring Boot实战笔记(五)-- Spring高级话题(Spring Aware)

    一.Spring Aware Spring 依赖注入的最大亮点就是你所有的 Bean 对 Spring容器的存在是没有意识的.即你可以将你的容器替换成其他的容器,如Google Guice,这时 Be ...

  7. MyISAM和InnoDB的索引实现

    在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引.我们主要分析B-Tree 索引. B-Tree 索引是 MyS ...

  8. PAT1061:Dating

    1061. Dating (20) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holme ...

  9. 免密登录-python

    要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前,还有一个重要的事情要处理,那就 ...

  10. python中用locust做简单的压力测试

    验证导入包成功 首先导入locust模块,百度一下导入方法很多,就不多说了 验证导入成功或失败,在终端中(windows中是cmd)输入:locust --help 导入成功后会出现如下界面: 编辑运 ...