点击蓝字关注我们

课程链接:http://video.jessetalk.cn/course/explore

良心课程,大家一起来学习哈!

任务16:介绍

1、依赖注入概念详解

  • 从UML和软件建模来理解

  • 从单元测试来理解

2、ASP.NET Core 源码解析

任务17:从UML角度来理解依赖

1、什么是依赖

当一个类A完成某个任务需要另一个类B来帮助时,A就对B产生了依赖

例如CustomerController需要对customer进行新增或查找时用到EF,则对EF的Context产生了依赖

var context = new CustomerContext(new DbContextOptions<CustomerContext>{});

2、显示依赖与隐式依赖

显示依赖:把一个类用到的所有外部组件放到一个类最上面,在构造函数里面初始化

private CustomerContext _context;

public CustomerController(){    _context = new CustomerContext(new DbContextOptions<CustomerContext>{});}

隐式依赖:需要用到的地方再初始化,不推荐

var context = new CustomerContext(new DbContextOptions<CustomerContext>{});

3、依赖倒置原则

依赖高层业务,不依赖低层业务的具体实现,而依赖于具体的抽象

CustomerController是高层业务的一个组件,依赖于CustomerContext是一个低层数据库的实现,如果现在需要把EF换成一个内存的实现或者mysql,需要修改CustomerController类,风险很大,所以应该依赖于低层业务的抽象

把低层业务方法抽象,比如查找,新增,抽象出一个接口,当不需要使用EF的时候,使用内存的实现替换

private ICustomerRepository _customerRepository;

public CustomerController(){    _customerRepository = new EfCustomerRepository(        new CustomerContext(new DbContextOptions<CustomerContext>{}));}

任务18:控制反转

实现依赖注入的方式不由自己决定,而是交给一个IOC容器,需要什么由容器传入,比如生产环境需要使用EF,则由容器传入一个EfCustomerRepository,而测试环境需要使用内存级别的,则传入一个MemoryCustomerRepository

private ICustomerRepository _customerRepository;

public CustomerController(ICustomerRepository customerRepository){    _customerRepository = customerRepository;}

任务19:单元测试

var repository = new Data.MemoryCustomerRepository();var controller = new CustomerController(repository);// 通过外部控制Controller里面的依赖

var customer = new Model.Customer(){    FirstName = "Mingson",    LastName = "Zheng",    Phone = "123456789",};

var result = controller.Add(customer);Assert.IsType<OkResult>(result);// 正确结果

var resultBad = controller.Add(customer);Assert.IsType<BadRequestObjectResult>(resultBad);// 错误结果

通过单元测试可以得知修改Bug过程中是否误删代码,导致原来通过的测试现在无法通过。

任务20:DI初始化的源码解读

Microsoft.AspNetCore.Hosting.WebHostBuilder

    /// <summary>    /// Builds the required services and an <see cref="T:Microsoft.AspNetCore.Hosting.IWebHost" /> which hosts a web application.    /// </summary>    public IWebHost Build()    {

      ......

      // 第一步,build

      IServiceCollection serviceCollection1 = this.BuildCommonServices(out hostingStartupErrors);

      // 第二步,获取ServiceCollection,ServiceProvider

      IServiceCollection serviceCollection2 = serviceCollection1.Clone();      IServiceProvider providerFromFactory = GetProviderFromFactory(serviceCollection1);

      ......

      // 第三步,new一个WebHost,传入ServiceCollection,ServiceProvider

      WebHost webHost = new WebHost(serviceCollection2, providerFromFactory, this._options, this._config, hostingStartupErrors);

      ......

      // 第四步,webHost初始化方法Initialize

        webHost.Initialize();

        ......

    }

第一步BuildCommonServices中new一个ServiceCollection就是在startup接口中使用

    private IServiceCollection BuildCommonServices(      out AggregateException hostingStartupErrors)    {

      ......

      ServiceCollection services = new ServiceCollection();

      // new完之后添加一些初始化操作

      ......

      return (IServiceCollection) services;    }

IStartup接口

namespace Microsoft.AspNetCore.Hosting{  public interface IStartup  {    IServiceProvider ConfigureServices(IServiceCollection services);

    void Configure(IApplicationBuilder app);// 配置管道  }}

第四步,webHost初始化方法Initialize

    public void Initialize()    {

        ......

        this.EnsureApplicationServices();

        ......

    }

    private void EnsureApplicationServices()    {

      ......

      this.EnsureStartup();      this._applicationServices = this._startup.ConfigureServices(this._applicationServiceCollection);    }

    private void EnsureStartup()    {      if (this._startup != null)        return;      this._startup = this._hostingServiceProvider.GetService<IStartup>();      if (this._startup == null)        throw new InvalidOperationException(string.Format("No startup configured. Please specify startup via WebHostBuilder.UseStartup, WebHostBuilder.Configure, injecting {0} or specifying the startup assembly via {1} in the web host configuration.", (object) "IStartup", (object) "StartupAssemblyKey"));    }

任务21:依赖注入的使用

了解ASP.NET Core 依赖注入,看这篇就够了:

http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/

点“在看”给我一朵小黄花

ASP.NET Core快速入门(第3章:依赖注入)--学习笔记相关推荐

  1. 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页  任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...

  2. ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHos ...

  3. ASP.NET Core快速入门(第2章:配置管理)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务9:配置介绍 命令行配置 Json文件配置 从配置文件文 ...

  4. ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 1.介绍与引入 2.配置管理 3.依赖注入 ...

  5. ASP.NET Core 快速入门

    ASP.NET Core 是一个由微软创建的,用于构建 web 应用.API.微服务 的 web 框架.通过本文的学习就能快速的入门ASP.NET Core,对大家的学习或者工作具有一定的参考学习价值 ...

  6. ASP.NET Core 快速入门(实战篇)

    上篇讲了<asp.net core在linux上的环境部署>.今天我们将做几个小玩意实战一下.用到的技术和工具有mysql.websocket.AngleSharp(爬虫html解析).n ...

  7. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  8. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...

  9. 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

最新文章

  1. python mqtt tls_python mqtt使用
  2. 埃森哲5G智慧城市报告:美国GDP将狂增5千亿
  3. vue12 循环添加重复数据
  4. c#金额转换成中文大写金额
  5. CPU资源和可用内存大小
  6. 部分不能激活Win 7 的问题分析和解决方案
  7. 【专升本计算机】专升本计算机期末考试复习题(A卷附答案)
  8. oracle视图总结(创建、查询、改动、删除等)
  9. [javase] 1.请从键盘随机输入10个整数保存到List中,并按倒序、从大到小的顺序显示出来...
  10. 【您还有心跳吗?超时机制分析 】
  11. 西电计算机考研数学,西安电子科技大学21考研数学高分上岸学长经验分享
  12. html页面布局实例,div布局实例
  13. ie7/8卸载工具 降级到IE6
  14. 桌面虚拟化正处于导入期
  15. flutter 屏幕截图,超出屏幕部分截图
  16. 计算机键盘复制键,键盘按键设置复制粘贴的方法
  17. 西甲联赛|DaoCloud > # Hello World
  18. 从边际效用递减原理看人的幸福感和前进动力
  19. 栈的应用4——递归函数的非递归形式(主讲阿克曼函数的非递归形式)
  20. “鸿蒙上交给国家”系误会

热门文章

  1. OpenJudge计算概论-最长单词2
  2. JS动态添加span等标签
  3. VS2010 NDoc的插件工具
  4. sql语句查询结果合并union 和union all用法
  5. 将Reporting Service 2005 SP2集成部署到WSS3或MOSS2007服务器场心得
  6. 世界杯,世界共同的游戏!
  7. bkwin设置文本控件为多行模式
  8. Windows Server 2008关闭默认windows共享
  9. MySQL IFNull 详解
  10. 编写一个程序,将一串字符倒序存放后输出。