本章介紹 nopCommerce 在 .net core 的啟動。 .net core 的 startup 有點難懂,因為有用到許多的技術,像是Autofac之類的。 如果瞭解的話,就能很順利地使用 ASP .net core 了。 本章與是 .net core 的重點項目,因為是基本項目,所以應該全盤瞭解。

Program -> Startup.cs

            public class Startup
            {
                #region Fields
        
                private readonly IConfiguration _configuration;
                private readonly IWebHostEnvironment _webHostEnvironment;
                private IEngine _engine;
                private NopConfig _nopConfig;
        
                #endregion
        
                #region Ctor
        
                public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
                {
                    _configuration = configuration;
                    _webHostEnvironment = webHostEnvironment;
                }
        
                #endregion
        
                /// <summary>
                /// Add services to the application and configure service provider
                /// 第一段執行
                /// </summary>
                /// <param name="services">Collection of service descriptors</param>
                public void ConfigureServices(IServiceCollection services)
                {
                    (_engine, _nopConfig) = services.ConfigureApplicationServices(_configuration, _webHostEnvironment);
                }
        
                /// <summary>
                /// 第二段執行 , 是 Autofac 的 Extension 方法
                /// 在 Program CreateHostBuilder 加入 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                /// </summary>
                public void ConfigureContainer(ContainerBuilder builder)
                {
                    _engine.RegisterDependencies(builder, _nopConfig);
                }
        
                /// <summary>
                /// Configure the application HTTP request pipeline
                /// 第三段執行
                /// </summary>
                /// <param name="application">Builder for configuring an application's request pipeline</param>
                public void Configure(IApplicationBuilder application)
                {
                    application.ConfigureRequestPipeline();
        
                    application.StartEngine();
                }
            }
        

ConfigureServices

整個 services 註冊流程在此 , 下方會介紹一些註冊工具

        public static (IEngine, NopConfig) ConfigureApplicationServices(this IServiceCollection services,
            IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
        {
            //most of API providers require TLS 1.2 nowadays
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            //add NopConfig configuration parameters
            var nopConfig = services.ConfigureStartupConfig(configuration.GetSection("Nop"));

            //add hosting configuration parameters
            services.ConfigureStartupConfig(configuration.GetSection("Hosting"));

            //add accessor to HttpContext
            services.AddHttpContextAccessor();

            //create default file provider
            CommonHelper.DefaultFileProvider = new NopFileProvider(webHostEnvironment);

            //initialize plugins
            var mvcCoreBuilder = services.AddMvcCore();
            mvcCoreBuilder.PartManager.InitializePlugins(nopConfig);

            //create engine and configure service provider
            var engine = EngineContext.Create();

            //這一段會找出所有繼承自 INopStartup 的物件 ,並依序執行它的 ConfigureServices 方法 共依下方五種順序執行
            //  1. ErrorHandlerStartup      0       => 空 (無實做)
            //  2. NopDbStartup             10      => Migrator、ConnectionStringAccessor、資料物件 Conventor 之類
            //  3. NopCommonStartup         100     => 重要
            //  4. AuthenticationStartup    500     => 認證服務之類的
            //  5. NopMvcStartup            1000    => 重要
            engine.ConfigureServices(services, configuration, nopConfig);

            //回傳這兩個物件來使用
            return (engine, nopConfig);
        }            
            

加入 HttpContext 可以使用 Request Response 等...

                services.AddSingleton();
            

加入使用 Session

            services.AddSession(options =>
            {
                options.Cookie.Name = $"{NopCookieDefaults.Prefix}{NopCookieDefaults.SessionCookie}";
                options.Cookie.HttpOnly = true;

                //whether to allow the use of session values from SSL protected page on the other store pages which are not
                options.Cookie.SecurePolicy = DataSettingsManager.DatabaseIsInstalled && EngineContext.Current.Resolve().CurrentStore.SslEnabled
                    ? CookieSecurePolicy.SameAsRequest : CookieSecurePolicy.None;
            });
            

加入使用 HttpClient 物件 , 參考此篇文章

            services.AddHttpClient().WithProxy();