NetCore2.0Web应用之Startup
为什么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相关推荐
- NetCore2.x 使用Log4Net(一)
前言:本章仅仅是Log4Net的基本简单的运用,后续章节会按照我的项目使用情况进行深入研究 1.项目搭建 新建一个基于.netCore2.x的Web项目 => 过程略 给新 ...
- NETCore2.2/3.0+使用带有权限验证的Swagger
文章目录 Swagger 什么是Swagger NuGet安装 Startup注册Swagger 设置默认首页打开Swagger 为接口添加注释 JWT 什么是JWT 注册授权认证服务 API接口添加 ...
- tomcat报 Context [] startup failed due toprevious errors
今天同事在实施项目中,遇到一个问题,就是项目布到tomcat服务器上了,却总是找不到访问路径.tomcat报 Context [] startup failed due toprevious erro ...
- STARTUP报错:ORA-00205: error in identifying control file, check alert log for more info
问题描述 startup nomount没有异常 startup mount则出现异常,说明控制文件出错
- tomcat的startup.bat闪退问题解决
从官网下载一个免安装的tomcat,我把它解压在E盘,配置了环境变量:CATALINA_HOME.CATALINA_BASE.TOMCAT_HOME 为 tomcat的解压路径 进入解压tomcat的 ...
- Linux 中打开tomcat的startup.sh 没有显示successed的方法。
网上下载了tomcat的压缩包,解压到home目录下,然后进入到bin目录下,输入./startup.sh 下面显示如下: 并没有显示successed,但是实际上已经成功启动了tomcat. 去网页 ...
- tomcat startup启动不起来 但也不报错_Resin 与 Tomcat 服务器对比
Resin 与 Tomcat对比(个人总结) 上图对比发现Tomcat对于Resin来说,有诸多优点,但是Resin也有很多优点. 比方说: 速度比较 resin的速度要比tomcat快3倍,当然了官 ...
- NetCore 2.0 MVC入门之 Startup 配置
2019独角兽企业重金招聘Python工程师标准>>> 刚接触netcore, 以下我正在使用的配置说明以及需要注入的几点 1.我在项目中因为不想使用构造函数注入,所以我引用了第三方 ...
- 报错解决:ad NaCl helper startup ack (0 bytes)
此文首发于我的个人博客:报错解决:ad NaCl helper startup ack (0 bytes) - zhang0peter的个人博客 在使用pyppeteer操作Chrome进行爬虫时,大 ...
最新文章
- css3-巧用选择器 “:target”
- AMBA、AHB、APB、AXI总线介绍和对比
- python使用for循环打印99乘法表-Python中的九九乘法表(for循环)
- Shell编程进阶篇(完结)
- GNU make manual 翻译(四十)
- 产品入门首月成长报告 | PMcaff-干货
- FPGA边沿检测Verilog实现(包含上升沿,下降沿,双边沿)
- Spring AOP基础—JDK动态代理
- Cisco交换机实现端口安全与帮定
- uboot 的i2c_read
- java设置按钮调用问题_按钮相关问题:尝试在空对象引用上调用虚方法
- 基于排队论模型的收银台服务系统的分析及可视化设计
- 将视频设置为电脑动态桌面的方法
- python判断工作日,节假日
- java项目1(家庭收支记账软件)
- 由于达到了总登录时间限制,远程回话被结束。这个限制是服务器管理员或网络策略设置的。
- Day505506.图灵学院之面试题① -面经
- 惯性传感器实现全身姿态检测
- 获取cookies(pyppeteer)
- X站全称是什么_工作中学习-没有校惯导之前为什么PFD不显示飞机姿态,而IFSD却能显示...
热门文章
- nginx windows 下安装和配置
- 小程序设计避免犯什么错_新设计师犯下的5种印刷错误以及如何避免
- ux和ui_糟糕的UI与UX番茄酱模因
- 1年工作经验8月份大厂面试全记录
- 一文读懂vuex4源码,原来provide/inject就是妙用了原型链?
- 部署zookeeper分布式节点
- 关于深度学习,这些知识点你需要了解一下
- [LeetCode][Java] Unique Paths II
- Java中short、int、long、float、double的取值范围
- The type android.support.v4.view.ScrollingView cannot be resolved. It is indirectly referenced from