ASP.NET Core快速入门(第3章:依赖注入)--学习笔记
点击蓝字关注我们
课程链接: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】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页 任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...
- ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHos ...
- ASP.NET Core快速入门(第2章:配置管理)--学习笔记
点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务9:配置介绍 命令行配置 Json文件配置 从配置文件文 ...
- ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 1.介绍与引入 2.配置管理 3.依赖注入 ...
- ASP.NET Core 快速入门
ASP.NET Core 是一个由微软创建的,用于构建 web 应用.API.微服务 的 web 框架.通过本文的学习就能快速的入门ASP.NET Core,对大家的学习或者工作具有一定的参考学习价值 ...
- ASP.NET Core 快速入门(实战篇)
上篇讲了<asp.net core在linux上的环境部署>.今天我们将做几个小玩意实战一下.用到的技术和工具有mysql.websocket.AngleSharp(爬虫html解析).n ...
- .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入
本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...
- ASP.NET Core如何在ActionFilterAttribute里做依赖注入
点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...
- 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入
本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...
最新文章
- python mqtt tls_python mqtt使用
- 埃森哲5G智慧城市报告:美国GDP将狂增5千亿
- vue12 循环添加重复数据
- c#金额转换成中文大写金额
- CPU资源和可用内存大小
- 部分不能激活Win 7 的问题分析和解决方案
- 【专升本计算机】专升本计算机期末考试复习题(A卷附答案)
- oracle视图总结(创建、查询、改动、删除等)
- [javase] 1.请从键盘随机输入10个整数保存到List中,并按倒序、从大到小的顺序显示出来...
- 【您还有心跳吗?超时机制分析 】
- 西电计算机考研数学,西安电子科技大学21考研数学高分上岸学长经验分享
- html页面布局实例,div布局实例
- ie7/8卸载工具 降级到IE6
- 桌面虚拟化正处于导入期
- flutter 屏幕截图,超出屏幕部分截图
- 计算机键盘复制键,键盘按键设置复制粘贴的方法
- 西甲联赛|DaoCloud > # Hello World
- 从边际效用递减原理看人的幸福感和前进动力
- 栈的应用4——递归函数的非递归形式(主讲阿克曼函数的非递归形式)
- “鸿蒙上交给国家”系误会