为什么80%的码农都做不了架构师?>>>   

作为main函数的程序启动文件UseStartup 默认就是调用我们的整个应用程序的启动文件
class Program{static void Main(string[] args){var host = new WebHostBuilder().UseKestrel()           // 指定WebServer为Kestrel.UseStartup<StartUpB>()  // 配置WebHost.Build();host.Run();                 // 启动WebHost}}
UseStartup

首先这是IWebHostBuilder接口的扩展类,这里有两个分支

1、如果StartUp从IStartup继承,则直接以单例的方式加入插件服务框架中。

2、如果不是从IStartup继承,则包装IStartup后,再以单例的方式加入插件服务框架中。

public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, Type startupType){var startupAssemblyName = startupType.GetTypeInfo().Assembly.GetName().Name;return hostBuilder.UseSetting(WebHostDefaults.ApplicationKey, startupAssemblyName).ConfigureServices(services =>{if (typeof(IStartup).GetTypeInfo().IsAssignableFrom(startupType.GetTypeInfo())){services.AddSingleton(typeof(IStartup), startupType);}else{services.AddSingleton(typeof(IStartup), sp =>{var hostingEnvironment = sp.GetRequiredService<IHostingEnvironment>();ConventionBasedStartup类正是继承了IStartup。       LoadMethods  内部调用FindConfigureDelegate 就是为了找到  Configure{0}此方法  public void Configure(IApplicationBuilder app){             }return new ConventionBasedStartup(StartupLoader.LoadMethods(sp, startupType, hostingEnvironment.EnvironmentName));});}});}
public class ConventionBasedStartup : IStartup{private readonly StartupMethods _methods;public ConventionBasedStartup(StartupMethods methods){_methods = methods;}public void Configure(IApplicationBuilder app){try{_methods.ConfigureDelegate(app);}catch (Exception ex){if (ex is TargetInvocationException){ExceptionDispatchInfo.Capture(ex.InnerException).Throw();}throw;}}public IServiceProvider ConfigureServices(IServiceCollection services){try{return _methods.ConfigureServicesDelegate(services);}catch (Exception ex){if (ex is TargetInvocationException){ExceptionDispatchInfo.Capture(ex.InnerException).Throw();}throw;}}}
public static StartupMethods LoadMethods(IServiceProvider hostingServiceProvider, Type startupType, string environmentName){var configureMethod = FindConfigureDelegate(startupType, environmentName);var servicesMethod = FindConfigureServicesDelegate(startupType, environmentName);object instance = null;if (!configureMethod.MethodInfo.IsStatic || (servicesMethod != null && !servicesMethod.MethodInfo.IsStatic)){instance = ActivatorUtilities.GetServiceOrCreateInstance(hostingServiceProvider, startupType);}Func<IServiceCollection, IServiceProvider> configureServices = services =>{             return services.BuildServiceProvider();};return new StartupMethods(instance, configureMethod.Build(instance), configureServices);}
private static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName){var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true);return new ConfigureBuilder(configureMethod);}
这个是源码实现的了一个IStartup 但是在默认的项目中并没有使用这个
正常情况下我们继承StartupBase 此抽象类 实现 Configure(IApplicationBuilder app) 方法就可以了
public abstract class StartupBase : IStartup{public abstract void Configure(IApplicationBuilder app);IServiceProvider IStartup.ConfigureServices(IServiceCollection services){ConfigureServices(services);return CreateServiceProvider(services);}public virtual void ConfigureServices(IServiceCollection services){}public virtual IServiceProvider CreateServiceProvider(IServiceCollection services){return services.BuildServiceProvider();}}

总结最终情况就是:我们的应用程序要启动文件必须满足一下方式就可以了

1、自己定义个类,必须包含Configure方法

2、继承自IStartup,实现所有方法

3、继承自StartupBase抽象类,只需要实现Configure方法

转载于:https://my.oschina.net/stuyun/blog/3014524

NetCore2.0Web应用之Startup相关推荐

  1. NetCore2.x 使用Log4Net(一)

    前言:本章仅仅是Log4Net的基本简单的运用,后续章节会按照我的项目使用情况进行深入研究 1.项目搭建 新建一个基于.netCore2.x的Web项目          =>   过程略 给新 ...

  2. NETCore2.2/3.0+使用带有权限验证的Swagger

    文章目录 Swagger 什么是Swagger NuGet安装 Startup注册Swagger 设置默认首页打开Swagger 为接口添加注释 JWT 什么是JWT 注册授权认证服务 API接口添加 ...

  3. tomcat报 Context [] startup failed due toprevious errors

    今天同事在实施项目中,遇到一个问题,就是项目布到tomcat服务器上了,却总是找不到访问路径.tomcat报 Context [] startup failed due toprevious erro ...

  4. STARTUP报错:ORA-00205: error in identifying control file, check alert log for more info

    问题描述 startup nomount没有异常 startup mount则出现异常,说明控制文件出错

  5. tomcat的startup.bat闪退问题解决

    从官网下载一个免安装的tomcat,我把它解压在E盘,配置了环境变量:CATALINA_HOME.CATALINA_BASE.TOMCAT_HOME 为 tomcat的解压路径 进入解压tomcat的 ...

  6. Linux 中打开tomcat的startup.sh 没有显示successed的方法。

    网上下载了tomcat的压缩包,解压到home目录下,然后进入到bin目录下,输入./startup.sh 下面显示如下: 并没有显示successed,但是实际上已经成功启动了tomcat. 去网页 ...

  7. tomcat startup启动不起来 但也不报错_Resin 与 Tomcat 服务器对比

    Resin 与 Tomcat对比(个人总结) 上图对比发现Tomcat对于Resin来说,有诸多优点,但是Resin也有很多优点. 比方说: 速度比较 resin的速度要比tomcat快3倍,当然了官 ...

  8. NetCore 2.0 MVC入门之 Startup 配置

    2019独角兽企业重金招聘Python工程师标准>>> 刚接触netcore, 以下我正在使用的配置说明以及需要注入的几点 1.我在项目中因为不想使用构造函数注入,所以我引用了第三方 ...

  9. 报错解决:ad NaCl helper startup ack (0 bytes)

    此文首发于我的个人博客:报错解决:ad NaCl helper startup ack (0 bytes) - zhang0peter的个人博客 在使用pyppeteer操作Chrome进行爬虫时,大 ...

最新文章

  1. css3-巧用选择器 “:target”
  2. AMBA、AHB、APB、AXI总线介绍和对比
  3. python使用for循环打印99乘法表-Python中的九九乘法表(for循环)
  4. Shell编程进阶篇(完结)
  5. GNU make manual 翻译(四十)
  6. 产品入门首月成长报告 | PMcaff-干货
  7. FPGA边沿检测Verilog实现(包含上升沿,下降沿,双边沿)
  8. Spring AOP基础—JDK动态代理
  9. Cisco交换机实现端口安全与帮定
  10. uboot 的i2c_read
  11. java设置按钮调用问题_按钮相关问题:尝试在空对象引用上调用虚方法
  12. 基于排队论模型的收银台服务系统的分析及可视化设计
  13. 将视频设置为电脑动态桌面的方法
  14. python判断工作日,节假日
  15. java项目1(家庭收支记账软件)
  16. 由于达到了总登录时间限制,远程回话被结束。这个限制是服务器管理员或网络策略设置的。
  17. Day505506.图灵学院之面试题① -面经
  18. 惯性传感器实现全身姿态检测
  19. 获取cookies(pyppeteer)
  20. X站全称是什么_工作中学习-没有校惯导之前为什么PFD不显示飞机姿态,而IFSD却能显示...

热门文章

  1. nginx windows 下安装和配置
  2. 小程序设计避免犯什么错_新设计师犯下的5种印刷错误以及如何避免
  3. ux和ui_糟糕的UI与UX番茄酱模因
  4. 1年工作经验8月份大厂面试全记录
  5. 一文读懂vuex4源码,原来provide/inject就是妙用了原型链?
  6. 部署zookeeper分布式节点
  7. 关于深度学习,这些知识点你需要了解一下
  8. [LeetCode][Java] Unique Paths II
  9. Java中short、int、long、float、double的取值范围
  10. The type android.support.v4.view.ScrollingView cannot be resolved. It is indirectly referenced from