应用启动

ASP.NET Core 中的应用启动通过 Startup 类配置服务和应用的请求管道。
nop通过Nop.Web.Framework.Infrastructure.Extensions.ServiceCollectionExtensionsIServiceCollection接口进行了扩展

/// <summary>
/// Add services to the application and configure service provider
/// </summary>
/// <param name="services">Collection of service descriptors</param>
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    return services.ConfigureApplicationServices(Configuration);
}

/// <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();
}

配置服务

加载配置文件

首先加载 NopConfig,HostingConfig配置文件

HttpContext支持

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

IEngine 实例化

//create, initialize and configure the engine
var engine = EngineContext.Create();
    engine.Initialize(services);

Initialize方法进行了如下设置

  • API 访问支持TLS 1.2
  • 使用NopFileProvider为默认文件提供者,可以通过CommonHelper.DefaultFileProvider 获得
  • 添加services.AddMvcCore()
  • 插件初始化 PluginManager.Initialize(mvcCoreBuilder.PartManager, nopConfig)

文件系统

nop中的文件系统需要实现INopFileProvider接口,该接口默认由NopFileProvider类实现

插件初始化

PluginManager.Initialize方法用于初始化插件

//initialize plugins
var nopConfig = provider.GetRequiredService<NopConfig>();
var mvcCoreBuilder = services.AddMvcCore();
    PluginManager.Initialize(mvcCoreBuilder.PartManager, nopConfig);

初始化过程如下:

  • 读取 ~/App_Data/installedPlugins.json 文件中已安装插件的PluginName
  • 删除 ~/Plugins/bin 目录中的内容, ClearPluginShadowDirectoryOnStartup 为false时不删除
  • 读取 ~/Plugins 目录中的插件,并根据插件中 plugin.json 文件内容实例化 PluginDescriptor对象
  • 将插件所有dll程序集添加到 ApplicationPartManager.ApplicationParts 中,UsePluginsShadowCopy 值默认为true,会将dll拷贝到 ~/Plugins/bin 目录,详情请参考 PerformFileDeploy 方法

经过上边的步骤插件相关的程序集会加载到mvc框架中。

配置服务

应用启动时通过下列代码进行服务初始化

var serviceProvider = engine.ConfigureServices(services, configuration);

详细说明请参考配置服务.

启动定时任务

//implement schedule tasks
//database is already installed, so start scheduled tasks
TaskManager.Instance.Initialize();
TaskManager.Instance.Start();

请求管道