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