架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 66|回复: 0
打印 上一主题 下一主题

[交流] Startup类详解

[复制链接]
跳转到指定楼层
楼主
发表于 2019-2-11 19:48:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ASP.NET Core 运行原理剖析:Startup
Startup Class
1、Startup Constructor(构造函数)
2、ConfigureServices
3、Configure方法
Startup Class

Startup Class中含有两个重要方法:Configure方法用于每次http请求的处理,比如后面要讲的中间件(Middleware),就是在configure方法中配置。而ConfigureServices方法在Configure方法前调用,它是一个可选的方法,可在configureServices依赖注入接口或一些全局的框架,比如EntityFramework、MVC等。Startup 类的 执行顺序:构造 -> configureServices->configure

1、Startup Constructor(构造函数)

主要实现一些配置的工作,方法参数如下:

  • IHostingEnvironment: 用于访问应用程序的特殊属性,比如applicationName,applicationVersion。通过IHostingEnvironment对象下的属性可以在构造中实现配置工作。比如获取当前根路径找到配置json文件地址,然后ConfigurationBuilder初始化配置文件,最后可以通过GetSection()方法获取配置文件。代码清单如下:
    1. var builder = new ConfigurationBuilder()
    2.                             .SetBasePath(env.ContentRootPath)
    3.                              .AddJsonFile("appsettings.json");
    4.                      var configuration = builder.Build();
    5.                      var connStr = configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;
    复制代码
    根目录下的配置文件如下:
    1. {
    2.     "Data": {
    3.         "DefaultConnection": {
    4.             "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;"
    5.         }
    6.     }
    7. }
    复制代码
    ILoggerFactory: 提供创建日志的接口,可以选用已经实现接口的类或自行实现此接口,下面代码使用最简单的控制台作为日志输出。
    1. public Startup(IHostingEnvironment env, ILoggerFactory logger)
    2. {
    3.          var log = logger.CreateLogger("default");
    4.          logger.AddConsole();
    5.          log.LogInformation("start configure");
    6. }
    复制代码
  • 2、ConfigureServices主要实现了依赖注入(DI)的配置,方法参数如下:
    IServiceCollection:整个ASP.NET Core 默认带有依赖注入(DI),IServiceCollection是依赖注入的容器,首先创建一个类(Foo)和接口(IFoo),代码清单如下:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Threading.Tasks;

    5. namespace WebApplication1
    6. {
    7.    public interface IFoo
    8.     {
    9.         string GetFoo();
    10.     }
    11. }
    复制代码
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Threading.Tasks;

    5. namespace WebApplication1
    6. {
    7.     public class Foo : IFoo
    8.     {
    9.         public string GetFoo()
    10.         {
    11.             return "foo";
    12.         }
    13.     }
    14. }
    复制代码
    在ConfigureServices 中将接口和实现注入至容器
    1. public void ConfigureServices(IServiceCollection services)
    2.        {
    3.            services.AddTransient<IFoo, Foo>();
    4.        }
    复制代码
    如果想在每次Http请求后都使用IFoo的GetFoo()方法来处理,上面讲到可以在Configure方法中注册函数,在注册过程中由于使用了依赖注入(DI),因此可以直接通过RequestServices.GetRequiredService<IFoo>()泛型方法将IFoo对象在容器中取出。
    1. app.Run((context) =>
    2.            {
    3.                var str = context.RequestServices.GetRequiredService<IFoo>().GetFoo();
    4.                return context.Response.WriteAsync(str);
    5.            });
    复制代码
    除了自己的接口外,还支持通过扩展方法添加更多的注入方法,比如EntityFramework、mvc框架都实现自己的添加方法。
    1. public void ConfigureServices(IServiceCollection services)
    2. {
    3.     // Add framework services.
    4.     services.AddDbContext<ApplicationDbContext>(options =>
    5.         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

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

    9.     services.AddMvc();

    10.     // Add application services.
    11.      services.AddTransient<IFoo, Foo>();

    12. }
    复制代码
    3、Configure方法

    主要是http处理管道配置和一些系统配置,参数如下:

    • IApplicationBuilder: 用于构建应用请求管道。通过IApplicationBuilder下的run方法传入管道处理方法。这是最常用方法,对于一个真实环境的应用基本上都需要比如权限验证、跨域、异常处理等。下面代码调用IApplicationBuilder.Run方法注册处理函数。拦截每个http请求,输出Hello World。
      1. public void Configure(IApplicationBuilder app)
      2. {
      3.     app.Run((context) => context.Response.WriteAsync("Hello World!"));
      4. }
      复制代码
      IHostingEnvironment: 同构造参数ILoggerFactory: 同构造参数






上一篇:中文版3ds Max效果图制作课堂实录
下一篇:Grokking Deep Learning
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-2-19 15:56

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表