ASP.NET Core 应用程序Startup类介绍

Startup类配置服务和应用程序的请求管道。

Startup 类

ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup。在主程序的Web Host生成器(WebHostBuilderExtensions)的 UseStartup <TStartup> 扩展方法中指定启动类名称。

您可以为不同的环境定义不同的Startup类,并在运行时选择适当的Startup类。如果在Web Host配置或选项中指定startupAssembly(启动程序集),托管将加载该启动程序集并搜索 Startup 或 Startup[Environment] 类型。根据名称后缀匹配当前环境的类将被优先使用,所以如果应用程序在开发环境中运行,并包含一个Startup和一个StartupDevelopment类,他将使用StartupDevelopment类。

通俗的讲,ASP.NET Core应用程序启动的时候将会根据当前的运行环境(生产环境(Production)或者开发环境(Development))自动选择启动类。比如在一个ASP.NET Core应用程序中,具有两个启动类StartupStartupDevelopment,那么当我们的启动环境设置为开发环境的时候,启动时将会搜索启动程序集,优先使用StartupDevelopment这个带有Development后缀的启动类。

我们来验证一下!

建立两个启动类StartupStartupDevelopment,我们分别在这两个类的构造方法中打上标记以便于我们区分使用了哪个启动类。

Startup:

StartupDevelopment:

然后在Program类中设置启动程序集名称

我们通过修改launchSettings.json里的环境配置来切换环境:

我们可以看到当我们使用开发环境的时候使用的确实是StartupDevelopment启动类。

我们也可以通过调用UseStartup<TStartup>来定义一个固定的Startup类,该类将被使用而不考虑环境。 这是推荐的方法。

Startup类构造方法可以接受通过依赖注入提供的依赖性。 常用的方法是使用IHostingEnvironment来设置配置源。

Startup类必须包含Configure方法,并可以选择包含ConfigureServices方法,这两个方法在应用程序启动时调用。 该类还可以包含这些方法的特定于环境的版本。 ConfigureServices(如果存在)在Configure之前调用。

Configure方法主要是配置ASP.NET Core的中间件,相当于我们在ASP.NET中所说的管道,ConfigureServices主要是配置依赖注入(DI)。

ConfigureServices 方法

ConfigureServices方法是可选的; 但是如果使用的话,它会在WebHost的Configure方法之前被调用。 WebHost可能会在调用启动方法之前配置一些服务。 按照惯例,在这个方法中设置配置选项。

对于需要大量设置的功能,在IServiceCollection上添加Add[Service]扩展方法。 下面示例将应用程序配置为使用Entity Framework,Identity和MVC的服务:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

将服务添加到服务容器使得它们可以通过依赖注入在应用程序中使用(http://www.cnblogs.com/stulzq/p/7761128.html)。

在启动时可用的服务

ASP.NET Core依赖注入在应用程序启动期间提供服务。 您可以通过在Startup类的构造方法或其Configure方法中包含适当的接口作为参数来请求这些服务。 ConfigureServices方法只接受一个IServiceCollection参数(但是可以从这个集合中检索任何已注册的服务,所以不需要额外的参数)。

下面是一些通常由启动方法请求的服务:

  • 在构造方法中:IHostingEnvironment,ILogger<Startup>
  • ConfigureServices方法中:IServiceCollection
  • Configure方法中:IApplicationBuilder, IHostingEnvironment, ILoggerFactory

Startup类构造方法或其Configure方法可以请求由WebHostBuilder ConfigureServices方法添加的任何服务。 使用WebHostBuilder在启动方法中提供您需要的任何服务。

Configure 方法

Configure方法用于指定ASP.NET应用程序如何响应HTTP请求。 通过将中间件组件添加到由依赖注入提供的IApplicationBuilder实例来配置请求管道。

从下面的例子中,我们使用了几个扩展方法来配置支持BrowserLink,error pages, static files, ASP.NET MVC, 和 Identity的管道。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseIdentity();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

每个Use扩展方法将一个中间件组件添加到请求管道。 例如,UseMvc扩展方法将路由中间件添加到请求管道,并将MVC配置为默认处理程序。

有关如何使用IApplicationBuilder的更多信息,请参阅中间件

额外的服务,如IHostingEnvironmentILoggerFactory也可以在方法签名中指定,在这种情况下,如果这些服务可用,将被注入。

参考:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

POI导入导出【面试+工作】

POI导入导出【面试+工作】 1.场景一 近期项目中的excel导入导出功能需求频繁的出现,趁此机会,今天笔者对POI的Excel数据的导入导出做一...

3294
来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目

2340
来自专栏Ken的杂谈

基于GitLab的Code Review教程

也就是说,使用GitLab进行Code Review就是在分支合并环节发起Merge Request,然后Code Review完成后将代码合并到目标分支。

4593
来自专栏令仔很忙

EF大数据批量处理----BulkInsert

之前做项目的时候,做出来的系统的性能不太好,在框架中使用了EntityFramework,于是就在网上查资料,研究如何提高EF的性能。 在这分享一篇博客 批...

1203
来自专栏IMWeb前端团队

浏览器中的ECMAScript模块(译)

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 原文:https://jakearchibald.com/20...

1988
来自专栏Alice

1、大部分社交平台接口不支持https协议。

参考文献来自:http://wiki.mob.com/ios9-%E5%AF%B9sharesdk%E7%9A%84%E5%BD%B1%E5%93%8D%EF%...

3475
来自专栏数据分析

[译]Asp.net MVC 之 Contorllers(二)

URL路由模块 取代URL重写 路由请求 URL路由模块的内部结构 应用程序路由 URL模式和路由 定义应用程序路由 处理路由 路由处理程序 处理物理文件请求 ...

3646
来自专栏哈雷彗星撞地球

GCD API 理解 (一)资料先行

GCD 深入理解:第一部分 GCD 深入理解:第二部分 以上两篇文章是关于GCD讲的比较好的文章,翻译自raywenderlich,该网站有很多关于iOS ...

1042
来自专栏林德熙的博客

Roslyn 如何在 Target 引用 xaml 防止文件没有编译

在使用新的项目格式,可以使用 Target 添加项目,但是有一些项目需要在合适的时候添加,如果添加早了,那么会让用户看到这些文件,如果添加的时间是在引用编译之后...

551
来自专栏酷玩时刻

10分钟搭建属于自己的ngork服务器,实现内网穿透Window启动脚本Mac Linux启动脚本

ngrok 是一个使用go语言编写的反向代理软件,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

1403

扫码关注云+社区