在程序中许多操作,都是基于设置实体及其相关类的定义实现的,即设置实体及其相关类与nopCommerce程序中绝大多数其它类的定义,存在着极高程度的耦合关系,这些其它类就包含密码的加/解密类的定义实现,所以在实现加/解密类的定义实现之前,必须先对设置实体及其相关类才进行定义实现。
0035 ISettings、SecuritySettings、Setting
SecuritySettings类,继承于ISettings接口,通过该类中的属性成员存储当前程序中一些与安全相关的数据信息值。
Setting类:
<1>、一个设置实体类,通过该实体类及其属性成员实现当前程序与数据库中指定表之间的数据交互操作。
<2>、设置实体类所所对应的设置表中存在着大量的默认设置数据,而这些数据在程序执行时,需要被缓存到内存中,从而大幅度的的减少程序对数据库表的访问频率(这是Setting设置实体类实例的重要功能和工作重点),来提升“nopCommerce”程序的性能,“nopCommerce”程序中缓存相关类的定义实现,与设置实体有着极高的耦合程序,所以Setting设置实体类及其相关定义,是缓存相关类的定义实现的一个必须的前提条件和必要首先需要完成的准备工作;也可以反过来理解,缓存相关类的定义实现,是Setting设置实体类及其相关定义实现的一个必须的前提条件和必要首先需要完成的准备工作。
0036 SettingBuilder
SettingBuilder类,该类通过对父类中同名方法进行覆写,对客户角色实体类、属性成员进行约束关系和规则进行相应的定义,并把这些约束有关系和规则的定义,映射到相应的数据库中新生成的一个设置表及其字段上。
1、重构Nop.Data.Migrations.SchemaMigration类,通过本次重构在指定的数据库软件的相应数据库中自动生成设置表。
0037 IRepository、EntityRepository
EntityRepository类,继承于IRepository接口,通过第三方FluentMigrator数据交换中间件,该类通过一个指定的实体类与指定数据库相应的表之间,实现数据的CURD交互操作。
0038 ISettingService、SettingService
EntityRepository类,继承于IRepository接口,通过第三方FluentMigrator数据交换中间件,该类通过一个指定的实体类与指定数据库相应的表之间,实现数据的CURD交互操作。
2、重构Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法添加语句:
//通过.NetCore框架依赖注入容器实例的指定API方法,对实体仓储具体实现类进行依赖注入操作,为程序与指定数据库的CURD操作提供支撑。
services.AddScoped(typeof(IRepository<>), typeof(EntityRepository<>));
//通过.NetCore框架依赖注入容器实例的指定API方法,对设置服务具体实现类进行依赖注入操作。
services.AddScoped<ISettingService, SettingService>();
//对所有继承于ISettings接口的具体实现类,进行依赖注入操作。
var settings = typeFinder.FindClassesOfType(typeof(ISettings), false).ToList();
foreach (var setting in settings)
{
services.AddScoped(setting, serviceProvider =>
{
//对所有继承于ISettings接口的具体实现类,进行实例化操作。
return serviceProvider.GetRequiredService<ISettingService>().LoadSettingAsync(setting, 0).Result;
});
}
3、按F5执行程序:
注意:
1、在nopCommerce_4.40.3程序中,通过MemoryCacheManager具体实现类,将缓存相关定义作为该程序的基本和必须的执行基础,不像nopCommerce_4.20、nopCommerce_4.30那样,把Redis缓存相关定义直接定义在核心层中,而是作为程序的一个插件,被定义在插件层中作为备用的缓存存储方案 ,这种迁移定义方案既保证程序的功能的强大,也保证了适用范围的广泛,同时还使定义实现逻辑更加的合理。由于缓存定义在nopCommerce_4.40.3程序中的必然性和基础性,所以在nopCommerce_4.40.3程序中有绝大部分类的定义实现与缓存定义有着极高程序的耦合,这其中就包含:EntityRepository类、SettingService类的定义实现,但本人为了简化当前示例程序的实现逻辑,删除了这两个类中关于缓存定义的实现和调用。
2、本地化的定义实现已经成为当前所有工程性软件的必备和基本的功能,例如最常用的有:通过程序中的本地化定义的定位操作,自动获取当前用户所在的地址,以减少用户的直接输入,从而提升用户的使用体验。在nopCommerce程序中,本地化的定义实现也是其必备和基本的功能,所以在nopCommerce程序中有绝大部分类的定义实现与本地化的定义实现有着极高程序的耦合,但本人为了简化当前示例程序的实现逻辑,删除了本地化相关的定义。
对以上功能更为具体实现和注释见:21-08-11_Nop_4.40.3(011_设置实体及其相关类的定义实现)。