在ASP.NET Core中,Startup类为Web应用的入口类,用于配置Web服务的管道/过滤器以及Web应用所能用到的服务。在启动Web应用后,ASP.NET将在主库中查询名为Startup的类,无论查找到的Startup类的访问限制是什么,ASP.NET Core将直接加载该类并执行后续的操作。ASP.NET的查询方式为首先查找主库中的根命名空间,根命名空间中不包含Startup类,则根据字典序查找剩余的命名空间,并加载第一个找到的Startup类。(这一段存疑)

Startup类参照依赖注入(Dependency Injection)设计模式实现。在Startup类中所依赖的对象,可以通过Startup类的构造方法注入到类内。依照规定,Startup类中必须包含Configure方法,可以定义ConfigureServices方法。

0x00 Startup类中依赖的对象所在容器在哪儿?

首先,要说明OWIN所定义的层次模型。

  1. Host层,用于配置程序以及启动进程。
  2. Server层,用于提供HTTP Server,配置Middleware以及相应服务。
  3. Middleware层
  4. Application层

这里我们不关注Middleware以及Application层所要负责哪些东西,仅关注Host和Server层。 我们可以发现,Host层中所实现的内容,在Program.Main方法中实现,同时这个方法也是真正程序的入口。而Server层就是我们现在所论及的Startup类中的东西了,那很容易就能明白,注入到Startup类中的对象,原来所处的容器应该是在Host层中。我们进一步去观察Program.cs文件中的内容

public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run()
}

代码中不能发现其容器所在,而在IWebBuilder接口中(即host的类型)是如下定义的

public interface IWebHost : IDisposable
{
IFeatureCollection ServerFeatures { get; }
IServiceProvider Services { get; }
void Start();
}

很显然地,Services便是我们要找的依赖对象容器。

0x01 Configure方法

该方法便是用于安排布置在管道中过滤器的顺序的方法。配置过滤器必须要使用IApplicationBuilder的实例,该实例同样是通过依赖注入的方法进入到Configure方法中使用的。因此Configure方法必须携带一个IApplicationBuilder参数。因为是依赖注入,如果有需要,还可以再添加。

在本方法中,以Use开头的方法均是在管道中添加一个过滤器。

0x02 ConfigureServices方法

Startup方法中,可以有选择的添加该方法,该方法用于配置应用所能使用的服务,这里同样是使用了依赖注入的设计模式,ConfigureServices中的内容就是在装填应用所依赖的服务容器。

.net core Web应用启动类的更多相关文章

  1. asp.net core 系列 2 启动类 Startup.CS

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 在探讨Startup启动类之前,我们先来了解下Asp.NET CORE 配置应用程序的执行顺序 ...

  2. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  3. .Net Core初识以及启动配置

    .net程序员为什么要学习.net core .Net Core 是.Net的未来,微软在19年 5月已经明确说明,未来只有.Net 5(=.NET Core vNext),.Net 5是.net c ...

  4. 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

    设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...

  5. asp.net core 系列 2 启动Startup类介绍

    一.Startup类 ASP.NET Core 应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器.其中Main方法是应用的托管入口点,Main 方法调用 WebHos ...

  6. Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误——SHH框架

    SHH框架工程,Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误 1.查看配置文件web.xml中是否配置.or ...

  7. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  8. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  9. NET CORE 应用程序启动

    原文:Application Startup作者:Steve Smith翻译:刘怡(AlexLEWIS)校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程序提供 ...

随机推荐

  1. 认识python正则模块re

    python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...

  2. ftpClient.retrieveFileStream导致FTPClient的后面操作失败

    问题代码: FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName ...

  3. weiFenLuo.winFormsUI.Docking.dll学习

    引用方法: 1.建立一个WinForm工程,默认生成了一个WinForm窗体. 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll. 3 ...

  4. ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析

    最近 在学习Android3.0中推出的 Loader 机制,其中CursorLoader 这个加载器说是可以实时监测数据和更新数据,为了一探究竟,就连带的将 ContentProvider和Curs ...

  5. (转)MySQL主主互备结合keepalived实现高可用

    MySQL主主互备结合keepalived实现高可用 原文:http://7424593.blog.51cto.com/7414593/1741717 试验环境: master:192.168.1.2 ...

  6. Ejb3.0+jboss 8 创建EJB demo

    工具:Eclipse , wildfly 8.x 1.服务端: 1)创建接口 package com.welv.ejb; public interface FirstEjb { public Stri ...

  7. 将静态网页部署到git上访问

    1.将已有的项目放在github上 http://www.cnblogs.com/zqunor/p/6583182.html 2.出现错误解决方案 提交错误 http://blog.csdn.net/ ...

  8. AngularJS 的常用特性(三)

    6.表达式  在模板中使用表达式是为了以充分的灵活性在模板.业务逻辑和数据之间建立联系,同时又能避免让业务逻辑渗透到模板中. <div ng-controller="SomeContr ...

  9. [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序

    如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...

  10. ibatis插入正确但查询不出数据的问题

    现在,使用打印的sql在oracle数据库客户端能查询出结果,但执行ibatis查询语句不行,ibatis插入可以. 解决问题的历程: 1. 去掉sql中的where语句,仍然查找不到,确定不是sql ...