前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >asp.net5 的应用启动 原

asp.net5 的应用启动 原

作者头像
申君健
发布2018-09-21 10:11:14
8650
发布2018-09-21 10:11:14
举报
文章被收录于专栏:前端侠2.0

参考来源:

http://docs.asp.net/en/latest/conceptual-overview/aspnet.html

http://docs.asp.net/en/latest/fundamentals/startup.html

asp.net5应用是运行在dnx之上的,每一个程序都是一个dnx项目,通过 Microsoft.AspNet.Hosting 这个包来加载的。

与Node.js做个类比:

node.exe    index.js  相当于node这个程序打开代码文件,加载运行。

                                  在进程里增加一个Node.js: Server-side JavaScript的进程,占空间7.6MB。

dnx web    相当于dnx程序搜索当前目录,找到project.json,并找到里面相应的命令,然后加载相应的代码并运行。

                  我机器是64位的win10.,在进程里增加一个dnx(32位)的进程,在我机器上大概28MB的内存。  

代码语言:javascript
复制
public class Startup{
     public void ConfigureServices(IServiceCollection services)
     {
     //定义用户服务
     }

     public void Configure(IApplicationBuilder app)
     {
     //定义中间件
     }}

Services:

底层是通过DI 而创建的组件,用于通用部分。服务有三种:单件、局部作用域、即时服务。

即时服务,每次使用都创建。局部作用域服务是每次请求时,创建一个作业域。单件服务是全局只有一个的服务。

Middleware

中间件是asp.net5处理时每个请求管道。它处理HttpContext  上的异步逻辑,并且可以按顺序调用之后的中间件,也可以随时中断请求。是在Configure方法里,通常用UseXXX的一个IApplicationBuilder 扩展方法来调用。

asp.net5有一组预定义好的中间件,比如静态文件访问,路由,诊断,认证。 你还可以自定义一个

Servers服务端。

通过Hosting并不直接监听请求,而是一个HTTP Servergo 监听,并将其转为一个HttpContext。

服务支持IIS或者self hosting 。在window上, WebListener server是基于HTTP.sys,并且脱离IIS的一个服务。

在非windows中,可以使用跨平台的 Kestrel web server

Web root

在project.json中,可以定义根目录。比如处理静态文件时的根目录。

Configuration

asp.net5支持一种简单的 键值对的配置信息。 它是内置的功能,支持多种文件类型、环境变量。

在startup.cs中,定义一个静态变量。初始化时,让它加载各种配置。然后程序其它地方直接通过

Startup.Configure就能使用信息。

应用启动

Startup类是程序的入口,这里加载配置,服务。启动时,会在程序集中在所有空间搜索叫Startup的类。你也可以指定一个类名,通过Hosting:Application 的配置的键值,启动类是不是public并无关系。  如果有多个同名的类,程序会搜索与项目根命名空间相同的优先,找不到,则根据命名空间的字母表顺序来决定。

Startup类的构造函数也支持依赖注入,比如IApplicationEnvironment的参数。

Startup类通常它必须定义一个Configure函数,以及可选的ConfigureServices函数。

Configure函数是用来指定应用如何处理HTTP请求的。通常复杂的请求管道的配置是封闭在中间件里,然后中间件再做成IApplicationBuilder的扩展方法来被Use. 函数必须有IApplicationBuilder 类型 的参数,后两个是可选的参数IHostingEnvironment and ILoggerFactory 

这些参数的对象都是通过依赖注入产生的。依赖注入是Microsoft.Extensions.DependencyInjection包实现的功能。它向外提供IServiceCollection的一个实例,挂载着所有已经添加的ServiceDescriptors。

个人认为asp.net5此处的Service命名有些问题 !IServiceCollection本是依赖注入的服务集合,它可以随时添加一个服务描述符(ServiceDescriptors),也随时可以反向生成一个实例对象来。asp.net5自身的服务Service前面描述过,代表一个功能模块或功能组件,比如mvc,静态文件服务等。

但我也不确定这两个Service到底指定的是不是同一个意思,或是故意为之。

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services){
      Console.WriteLine(services.Count); //显示13
      services.AddMvc();
     Console.WriteLine(services.Count);//显示112,表明向依赖注入的服务集合里缓存了99个服务描述
}

asp.net5的依赖注入的相关内容看了一些,但一直无法深入。因为每个文档都是在讲:如何在Startup里自动注入参数,如何在Startup里添加一个服务,然后到Controller里,构造注入。

关键的疑问点:Startup构造函数,Configure函数,Controller的构造函数注入时,为什么写个参数就能注入了,这不很奇怪吗?是通过重载实现的吗?可能需要看一下源码才可以。

ConfigureServices 函数

这个函数在Startup类里,是可选的。它可以通过注入,传入一个IServiceCollection 实例作为参数.

ConfigureServices函数比Configure更早的调用,services.AddMvc();可以引入许多MVC必须的一些服务。

这样在app.UseMvc()时,这些服务才能在请求来到 时被使用。

建议在使用时,把一些服务做成IServiceCollection 的扩展,比如下面这样:

代码语言:javascript
复制
services.AddEntityFramework()
        .AddSqlServer();

这些添加进来的服务就进入到依赖注入的容器里了,随时可以在你的应用中访问到。通过依赖注入,可以在函数里注入参数,代替“硬编码”,是非常好的编程实践!

ConfigureServices函数还是你添加配置---Configuration的地方

最后一段是讲框架支持注入的服务,重点是Startup构造函数以及两个Configre的函数里的参数。它们分别有什么用,有什么属性可以获取!

 The framework services and objects include:

  • IApplicationBuilder
  • Used to build the application request pipeline. Available only to the Configuremethod in Startup. Learn more about Request Features.
  • IApplicationEnvironment
  • Provides access to the application properties, such as ApplicationName,ApplicationVersion, and ApplicationBasePath. Available to the Startup constructor andConfigure method.
  • IHostingEnvironment
  • Provides the current EnvironmentNameWebRootPath, and web root file provider. Available to the Startup constructor and Configure method. Learn more about ? Hosting.
  • ILoggerFactory
  • Provides a mechanism for creating loggers. Available to the Startup constructor andConfigure method. Learn more about Logging.
  • IServiceCollection
  • The current set of services configured in the container. Available only to theConfigureServices method, and used by that method to configure the services available to an application.

下面是三个函数调用里,服务所对应的参数依次是

Startup Constructor - IApplicationEnvironment - IHostingEnvironment - ILoggerFactory

ConfigureServices - IServiceCollection

Configure - IApplicationBuilder - IApplicationEnvironment - IHostingEnvironment -ILoggerFactory

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/12/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Services:
  • Middleware
  • Servers服务端。
  • Configuration
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档