0068 IStoreMappingSupported、Language、ScheduleTask
Language类,继承于IStoreMappingSupported接口,通过该实体类及其属性成员实现当前程序与数据库中指定表之间的数据交互操作。
ScheduleTask类,通过该实体类及其属性成员实现当前程序与数据库中指定表之间的数据交互操作。
0069 LanguageBuilder、ScheduleTaskBuilder
LanguageBuilder类,该类通过对父类中同名方法进行覆写,对语言实体类、属性成员进行约束关系和规则进行相应的定义,并把这些约束有关系和规则的定义,映射到相应的数据库中新生成的一个语言表及其字段上。
ScheduleTaskBuilder类,该类通过对父类中同名方法进行覆写,对计划任务实体类、属性成员进行约束关系和规则进行相应的定义,并把这些约束有关系和规则的定义,映射到相应的数据库中新生成的一个计划任务表及其字段上。
1、重构Nop.Data.Migrations.SchemaMigration类,通过本次重构在指定的数据库软件的相应数据库中自动生成语言表和计划表。
0070 IScheduleTaskService、ScheduleTaskService
ScheduleTaskService类,继承于IScheduleTaskService接口,通过该类中的定义实现了页面、程序和数据库指定表之间计划任务相关数据信息的交互操作。
0071 TaskThread、TaskManager
TaskThread类,通过该类把程序中所有的计划任务实例添加到定时器实例中。
TaskManager类,通过该类把程序中所有的计划任务实例添加到定时器实例中。
0072 Task、IScheduleTask
Task类,通过该类把程序中所有的计划任务实例添加到定时器实例中。
IScheduleTask接口,继承于该接口的具体实现类,定义实现当前程序的一个指定的计划任务类。
注意:
为了简化实现,删除了程序中所有继承于IScheduleTask接口的具体实现类。
0073 IImportManager、ImportManager
ImportManager类,继承于IImportManager接口,通过该类中的定义实现了数据向数据库指定表的导入操作。
注意:
- 为了简化实现,删除了ImportManager类及其IImportManager接口中的所有定义实现。
2、定义ImportManager类及其IImportManager接口的主要作用,是通过在Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法直接把ImportManager类及其IImportManager接口注入到.NetCore框架中,从而间接把IHttpClientFactory接口注入到.NetCore框架中,否则会在在Nop.Services.Tasks.TaskThread.RunAsync方法语句:
client = EngineContext.Current.Resolve<IHttpClientFactory>().CreateClient(NopHttpDefaults.DefaultHttpClient);生产异常:“System.NullReferenceException:“Object reference not set to an instance of an object.””
3、nopCommerce开发者在程序中定义了一些间接注入操作,我不是很明白他们为什么不把这些间接注入操作重构定义在Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法中,变为直接注入操作,从而进一步减少程序的耦合程序。
2、定义Nop.Services.Installation.InstallationService.InstallLanguagesAsync方法,把一些默认数据持久化到语言表中。
3、定义Nop.Services.Installation.InstallationService.InstallScheduleTasksAsync方法,把一些默认数据持久化到计划任务表中。
4、重构Nop.Web.Framework.Infrastructure.Extensions.ApplicationBuilderExtensions.StartEngine方法添加语句:
//如果当前程序的数据库已经存在于数据库软件,则执行下面的操作。
if (DataSettingsManager.IsDatabaseInstalled())
{
//安装和启动程序中定义的所有计划任务类(这些类必须继承于IScheduleTask的接口)实例。
Services.Tasks.TaskManager.Instance.Initialize();
Services.Tasks.TaskManager.Instance.Start();
}
5、重构Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法添加语句:
//通过.NetCore框架依赖注入容器实例的指定API方法,对计划任务具体实现类进行依赖注入操作。
services.AddScoped<IScheduleTaskService, ScheduleTaskService>();
//通过.NetCore框架依赖注入容器实例的指定API方法,对导入管理器具体实现类进行依赖注入操作。
//间接把INopFileProvider接口依赖注入到.NetCore框架内置容器实例中。
services.AddScoped<IImportManager, ImportManager>();
6、重构Nop.Web.Controllers.InstallController.Index方法添加语句:
//获取一个指定的本地化信息实例,即本地化的语言(这里特指:"en-US")。
var cultureInfo = new CultureInfo(NopCommonDefaults.DefaultLanguageCulture);
//获取一个指定的区码信息实例,即本地化的国家(这里特指:"US")。
var regionInfo = new RegionInfo(NopCommonDefaults.DefaultLanguageCulture);
var languagePackInfo = (DownloadUrl: string.Empty, Progress: 0);
//获取安装服务实例,通过执行该实例把当前程序中定义的所有默认数据值,持久化存储到指定数据库的一些表中。
var installationService = EngineContext.Current.Resolve<IInstallationService>();
await installationService.InstallRequiredDataAsync(model.AdminEmail, model.AdminPassword, languagePackInfo, regionInfo, cultureInfo);
7、按F5执行程序,把Language类实例和ScheduleTask类实例的默认数据值,自动持久化指定数据库的语言表和计划任务表中。
对以上功能更为具体实现和注释见:21-08-31_Nop_4.40.3(022_自动生成语言和计划任务表,所有页面正常显示)。