asp.netcore 3.1 program、Startup 类详解

Program类 

public class Program
    {
        /// <summary>
        /// 应用程序入口
        /// 1.asp.netcore 本质上是控制台程序
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            //执行完build之后,就从控制台程序变成了asp.netcore
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Startup 类

public class Startup
    {
        private readonly IConfiguration _configuration;
        /// <summary>
        /// 通过构造函数注入
        /// </summary>
        /// <param name="configuration"></param>
        public Startup(IConfiguration configuration)
        {
            _configuration = configuration;
            var aa = _configuration["FyyAspnetcore:Name"];// 获取 appsettings.json文件的数据
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        //运行时同通过约定来调用 这个类 的两个方法。先调用 ConfigureServices、再调用 Configure.
            /// <summary>
            /// 负责依赖注入配置
            /// </summary>
            /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {
            /*DI的优点:
             * 1.解耦,没有强依赖,Controller与具体的服务类解耦,
             * 2.利于单元测试
             * 3.不需要了解具体的服务类:Controller 不需要了解服务类及其工作细节。
             * 4.也不需要管理服务类的生命周期:Controller 不需要管理服务类的生命周期,生命周期交给IOC容器DI来控制。
             */


            //2.当IClock 被请求时,IOC容器会返回一个CnClock的实例。
            services.AddSingleton<IClock, CnClock>();//AddSingleton 表示所注册的服务周期 是整个应用程序生存期间,整个应用程序只有一个实例,只有应用程序停止,才会被销毁。
            //services.AddScoped<IClock, USClock>;//所注册的服务的生命周期是整个请求期间。一次web请求产生一个实例,web请求处理完的时候,生命周期就结束了。
            //services.AddTransient<IClock, USClock>;//所注册的服务的生命周期是暂时的,服务每次没请求的时候,都会实例化一个对象。

            //services.AddControllers();//注册webapi的服务

            //services.AddControllersWithViews();//注册mvc的服务

            //将配置文件的Json,映射到类中。(配置到类中,配置依赖注入)
            services.Configure<FyyAspnetcore>(_configuration.GetSection("FyyAspnetcore"));
        }

        /// <summary>
        /// Development环境变量时,走这个方法。可以针对不同的环境,使用不同的方法。
        /// </summary>
        /// <param name="app"></param>
        /// <param name="env"></param>
        //public void ConfigureDevelopment(IApplicationBuilder app, IWebHostEnvironment env)
        //{

        //}

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        /// <summary>
        /// 负责中间件,配置了asp.netcore http请求的管道。http请求从管道进来,处理完之后再从管道回去。如果管道什么都没有,请求进来,再回去,就什么都不会发生。
        /// 放在管道中能处理请求的东西,就是中间件(middleware)。
        /// </summary>
        /// <param name="app">是一个服务,通过依赖注入的方式注入进来,注入的是服务的接口</param>
        /// <param name="env">依赖注入</param>
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //判断环境变量
            //env.IsEnvironment("OK"); 判断自定义环境变量
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();//开发模式下插入到管道的第一个中间件。
            }

           // app.UseAuthentication();//使用授权中间件

            app.UseHttpsRedirection();//https 重定向中间件,强制客户端使用ssl协议。

            //如果需要使用html、js、css 等静态文件,就需要使用 UseStaticFiles 中间件,如mvc。
            //如果不使用这个中间件,客户端就访问不了这些静态文件。
            app.UseStaticFiles();

            app.UseRouting();//路由中间件。会检查在应用中已经注册的端点。

            app.UseEndpoints(endpoints => //注册端点,端点就是进来的http请求的url的结尾那部分。这部分由端点中间件处理。
            {
                endpoints.MapGet("/", async context =>// 以/结尾的url,映射到下面的表达式中。
                {
                    await context.Response.WriteAsync("Hello World!");
                });

                //MVC的路由端点,路由模板,路由表的形式
                //endpoints.MapControllerRoute(
                //        name:"default",
                //        pattern:"{controller=Home}/{action=Index}/{id?}"
                //    );

                //使用这种方式,可以在controller或action上添加路由,不需要添加路由表。
               // endpoints.MapControllers();
            });
        }
    }

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "FyyAspnetcore": {
    "Name": "Fengyinyong",
    "Age": 30
  }
}

 

上一篇:一步步入门:NetCore WebApi (包含搭建Swagger)


下一篇:120行代码打造.netcore生产力工具-小而美的后台异步组件