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/

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用wsimport命令创建Web Service客户端

一、wsimport简介 在jdk的bin文件夹中&#xff0c;有一个wsimport.exe工具。这个工具可以依据Web Service的描述文件wsdl生成相应的类文件&#xff0c;然后用这些类文件&#xff0c;被Web Service的客户端导入之后&#xff0c;就可以像调用本地的类一样调用WebService提供的方法…

读《持续交付2.0》

几年前看过《持续交付(发布可靠软件的系统方法)》&#xff0c;感触不是很深&#xff0c;最近看了这本书的译者乔梁编写的《持续交付2.0》&#xff0c;结合工作中的种种&#xff0c;又有一种相见恨晚的感觉。可见好书是需要经常翻阅的&#xff0c;每次都会带来新的收获和思考。全…

Java使用Apache CXF开发Web Service

转自&#xff1a;http://blog.csdn.net/hu_shengyang/article/details/38384597 以前工作中也用CXF,但都是用别人现成搭好的环境&#xff0c;这次自己重头搭建一遍环境。过程中也有遇到的问题&#xff0c;也做了简单的整理。 对于CXF是干什么用的&#xff0c;我不想多说&#x…

程序员修神之路--kubernetes是微服务发展的必然产物

菜菜哥&#xff0c;我昨天又请假出去面试了战况如何呀&#xff1f;多数面试题回答的还行&#xff0c;但是最后让我介绍微服务和kubernetes的时候&#xff0c;挂了话说微服务和kubernetes内容确实挺多的那你给我大体介绍一下呗可以呀&#xff0c;不过要请和coffee哦◆◆kubernet…

Java基础知识——Java数组详解

数组是一种数据结构&#xff0c;用来存储同一类型值的集合&#xff0c;可以存储基本数据类型和类。 数组的大小是固定的&#xff0c;通过一个整型下标&#xff08;从0开始&#xff09;可以访问数组中的每个值。此外&#xff0c;Java会对数组进行边界检查&#xff0c;如果发现有…

.NET core3.0 使用Jwt保护api

摘要&#xff1a;本文演示如何向有效用户提供jwt&#xff0c;以及如何在webapi中使用该token通过JwtBearerMiddleware中间件对用户进行身份认证。认证和授权区别&#xff1f;首先我们要弄清楚认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#…

Java ArrayList的实现原理详解

ArrayList是Java List类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于ArrayList的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、ArrayList实现原理总结 ArrayList的实现原…

.NET开发者的机遇与Web Blazor基础(有彩蛋)

一.唠唠WebAssembly的发展历程目前有很多支持WebAssembly的项目&#xff0c;但发展最快的是Blazor&#xff0c;这是一个构建单页面的.NET技术&#xff0c;目前已经从Preview版本升级到了beta版本&#xff0c;微软计划在2020年5月发布Blazor的第一个版本。Blazor是什么&#xff…

Java LinkedList的实现原理详解

LinkedList是Java List类型的集合类的一种实现&#xff0c;此外&#xff0c;LinkedList还实现了Deque接口。本文基于Java1.8&#xff0c;对于LinkedList的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09…

知乎高赞:中国有哪些不错的开源软件产品?

点击蓝字“dotNET匠人”关注我哟加个“星标★”&#xff0c;每日 7:15&#xff0c;好文必达&#xff01;在知乎上&#xff0c;有个问题问“中国有什么拿得出手的开源软件产品&#xff08;在 GitHub 等社区受欢迎度较好的&#xff09;&#xff1f;”事实上&#xff0c;还不少呢~…

Java LinkedList双向链表源码分析

LinkedList就传说中的双向链表了。是List 接口的链接列表实现。实现所有可选的列表操作&#xff0c;并且允许所有元素&#xff08;包括 null&#xff09;。除了实现 List 接口外&#xff0c;LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方…

容器日志管理 (2) 开源日志管理方案 ELK/EFK

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。上一篇《容器日志管理&#xff08;1&#xff09;》中介绍了Docker自带的logs子命令以及其Logging driver&#xff0c;本篇将会介绍一个流行的开源日志管理方案ELK/EFK…

Java ArrayList、LinkedList和Vector的使用及性能分析

第1部分 List概括 List 是一个接口&#xff0c;它继承于Collection的接口。它代表着有序的队列。 AbstractList 是一个抽象类&#xff0c;它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。 AbstractSequentialList 是一个抽象类…

关于Scrum起源,读这一篇论文就足够啦!《新新产品开发游戏》

关于Scrum的起源&#xff0c;我们经常会提到1986年发表在HBR上的一篇论文&#xff0c;《The New New Product Development Game》&#xff0c;今天我们把它重新翻译&#xff0c;一起重温为何Scrum会如此设置3355&#xff1f;为何会用橄榄球的术语来代表Scrum&#xff1f;The Ne…

Java HashMap的实现原理详解

HashMap是Java Map类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于HashMap的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、HashMap实现原理总结 HashMap的实现原理总结如下…

ASP.NET Core快速入门(第5章:认证与授权)--学习笔记

点击蓝字关注我们课程链接&#xff1a;http://video.jessetalk.cn/course/explore良心课程&#xff0c;大家一起来学习哈&#xff01;任务31&#xff1a;课时介绍1.Cookie-based认证与授权2.Cookie-based认证实现3.Jwt认证与授权介绍4.Jwt认证与授权实现5.Jwt认证与授权6.Role …

Java HashSet的实现原理详解

HashSet是Java Map类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于HashSet的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、HashSet实现原理总结 HashSet的实现原理总结如下…

asp.net mvc 自定义 pager 封装与优化

asp.net mvc 自定义 pager 封装与优化Intro之前做了一个通用的分页组件&#xff0c;但是有些不足&#xff0c;从翻页事件和分页样式都融合在后台代码中&#xff0c;到翻页事件可以自定义&#xff0c;再到翻页和样式都和代码分离&#xff0c; 自定义分页 pager 越来越容易扩展了…

Java LinkedHashMap的实现原理详解

1. LinkedHashSet概述&#xff1a; LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于&#xff0c;后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序&#xff0c;该迭代顺序可为插入顺序或是访问顺序…

.net core 中通过 PostConfigure 验证 Options 参数

.net core 中通过 PostConfigure 验证 Options 参数Intro在 .net core 中配置项推荐用 Options 来实现&#xff0c;有一些参数可能必须是用由用户来配置&#xff0c;不能直接写成默认值的参数&#xff0c;这样就需要就 Options 中的参数做一些校验&#xff0c;否则程序内部可能…