视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.NET Core源码解析配置文件及依赖注入
2020-11-27 22:34:27 责编:小采
文档


这段代码也就是从appsettings.json这个配置文件中的Content这个节点匹配到Content这个对象上。

6.修改下ContentController这个控制器代码如下:

private readonly Content contents;
 public ContentController(IOptions<Content> option)
 {
 contents = option.Value;
 }
 /// <summary>
 /// 首页显示
 /// </summary>
 /// <returns></returns>
 public IActionResult Index()
 {

 return View(new ContentViewModel { Contents=new List<Content> { contents} });
 }

7.按下F5运行下,然后导航到Content目录看到如下页面:说明成功从appsettings.json这个文件中加载了内容。这一切是怎么发生的呢?下面我们就一步一步的来分析。

8.我们回过头来看我们的Main方法,发现里面有一个CreateDefaultBuilder方法,就是这个方法里面为我们做了一些默认的设置,然后加载我们的配置文件的!

9.我们在源码里面找到CreateDefaultBuilder 的源码(反正我找了半天,起初在Hosting下面找,实际上在MetaPackages下面的),位置在src\MetaPackages\src\Microsoft.AspNetCore\WebHost.cs 有的人可能找不到哦,可以看到这个方法会在ConfigureAppConfiguration 的时候默认加载appsetting文件,并做一些初始的设置,所以我们不需要任何操作,就能加载appsettings 的内容了。

10.既然知道了原理后,我们就试着重写下这个ConfigureAppConfiguration 然后加载我们自定义的json文件吧。

11.鼠标右键新建一个Content.json文件,然后输入如下的内容:

{
 "ContentList": 
 {
 "Id": 1,
 "title": "title1 from diy json",
 "content": "content1 from diy json",
 "status": 1,
 "add_time": "2018-11-21 16:29",
 "modify_time": null
 }

}

12.然后打开Program.cs。按如下代码进行改造:

/// <summary>
 /// Main方法,程序的入口方法
 /// </summary>
 /// <param name="args"></param>
 public static void Main(string[] args)
 {
 CreateWebHostBuilder(args)//调用下面的方法,返回一个WebHostBuilder对象
 .Build()//用上面返回的WebHostBuilder对象创建一个WebHost
 .Run();//运行上面创建的WebHost对象从而运行我们的Web应用程序换句话说就是启动一个一直运行监听http请求的任务
 }

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
 WebHost.CreateDefaultBuilder(args)//使用默认的配置信息来初始化一个新的IWebHostBuilder实例
 .ConfigureAppConfiguration((hostingContext, config) =>
 {
 var env = hostingContext.HostingEnvironment;

 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
 .AddJsonFile("Content.json",optional:false,reloadOnChange:false)
 .AddEnvironmentVariables();

 })
 .UseStartup<Startup>();// 为Web Host指定了Startup类

13.然后Startup里面ConfigureServices中的代码修改如下:

14.然后按下F5运行下代码吧,如下图所示,从我们最新添加的json文件中加载出来数据了。

15.这里多讲一点,传统asp.net的web.config文件如果有更改的话是必须要重启站点才能使,配置文件生效的,但是asp.net core的配置文件是支持热更新的,及不重启网站也能加载更新,只需要设置一下属性即可,如下图所示:

16.配置文件的源码解读这块就到这里了。下面开始依赖注入的讲解。

依赖注入与控制反转

如果大家仔细阅读文章的话,相信已经看出来了,我上面提到过好几次依赖注入的概念。那么究竟什么是依赖注入呢?下面我们就拿我们上面的ContentController来好好的来理解下。

依赖注入:当一个对象ContentController需要另一个对象Content来协同完成任务的时候,那么这个ContentController就对这个Content对象产生了依赖关系。那么在这个ContentController中,是怎么注入的呢?就是从控制器中注入的了,如下图所示:

从asp.net 转过来的你是不是想起了之前的千篇一律的new对象啊。没对象自己new(要是女朋友也能new多好啊……)当然除了单例对象,静态哈。

这里又设计一个概念就是控制反转。

那么什么是控制反转呢?你上面看到没有,你自己new对象就是正转,因为你自己创建自己所要使用的对象,。那么这种不需要你自己new对象,而是直接传进来就是控制反转了。(不知道比喻的恰不恰当哈)

依赖注入与控制反转你是否已经了解了呢,喜欢思考的朋友可能会问了,那这个构造函数里面的IOptions<Content> option 又是怎么出来的?这里就要引入一个容器的概念了。

什么是容器呢?

这里创建IOptions<Content> option 这个对象的东西就是容器。还记得上面我们分析源码的时候,IServiceCollection 里面注入了很多东西吗?其实就是往IServiceCollection 这个容器里面注入方法,这样其他地方使用的时候就能自动注入了。

这就是容器的好处,由容器来统一管理实例的创建和销毁,你只需要关心怎么用就行了,不需要关系怎么创建跟销毁。

当然容器创建的实例都是有生命周期的,。下面罗列一下,就不过多的讲解了。

  • Transient: 每一次访问都会创建一个新的实例
  • Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
  • Singleton :整个应用程序生命周期以内只创建一个实例
  • 使用的方式也很简单,我会在接下来的课程中详细的通过实例来进行讲解!因为现在的例子还没发演示。

    总结

    本文一步一步带着你先分析了ASP.NET Core的启动过程及运行的原理,紧接着给你讲了配置文件的加载过程及原理,并通过示例代码演示了如何加载自定义的配置文件,最后引出了依赖注入以及控制反转的概念,并通过对我们上面例子的分析来紧身对依赖注入以及控制反转的理解。至此让你知其然更知其所以然。对ASP.NET Core的原理相信你已经了然于胸了!那么接下来让我们再准备下dapper,vue以及git的快速入门就开始我们的asp.net core cms的实战课程吧!还是那句话基础很重要,基础打好,后面才能事半功倍。谢谢大家。

    下载本文
    显示全文
    专题