了解NOP商务部设置如何从数据库加载(Understanding how Nop Commerce

2019-07-29 11:49发布

我有工作Nop Commerce和想知道,如果有人可以帮我与我的困惑。

我已经调试代码多次试图找出的设置是如何加载在Web应用程序的启动起来。 我只是不明白这一点!

所有设置类实现ISettings接口。 让我们的客户例如设置..我已经发现,它是由代表CustomerSettings类。 在数据库中有一个Setting table 。 为客户设置数据看起来somethng是这样的:

customersettings.usernamesenabled
customersettings.checkusernameavailabilityenabled
customersettings.allowuserstochangeusernames
... and so on...

每个设置从映射如何以及在何处customersettingsCustomerSettings类,并像一个属性usernamesenabled映射到UsernamesEnabled在CustomerSettings类属性? 以及为什么它这种方式来实现?

我知道它是与在下面的代码DependencyRegistrar类:

builder.RegisterGeneric(typeof(ConfigurationProvider<>)).As(typeof(IConfigurationProvider<>));
builder.RegisterSource(new SettingsSource());

如果有人能在正确的方向指向我,然后我们将不胜感激。

Answer 1:

希望我没有迟到。

只有一些相关的点,看明白是如何创建的结构:

-Nop.Services.Configuration.ConfigurationProvider class
-Nop.Services.Configuration.ISettingsService interface
-Nop.Services.Configuration.SettingsService class

该SettingsService唯一提供的功能从存储库存储和检索设置,并实现了一些缓存功能。

该ConfigurationProvider执行实际的魔力。

让我们来看看BuildConfiguration方法:

        // get properties we can write to
        var properties = from prop in typeof(TSettings).GetProperties()
                         where prop.CanWrite && prop.CanRead
                         let setting = _settingService.GetSettingByKey<string>(typeof(TSettings).Name + "." + prop.Name)
                         where setting != null
                         where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).CanConvertFrom(typeof(string))
                         where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).IsValid(setting)
                         let value = CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).ConvertFromInvariantString(setting)
                         select new { prop, value };

使用反射,*设置类(例如,CustomerSettings),进行检查和使用它们的性能从服务加载相应的设置。

然后将其转换回存储为字符串值(你可以检查NopCustomTypeConverter看到序列化是如何发生的),并将其分配回设置实体:

properties.ToList().ForEach(p => p.prop.SetValue(Settings, p.value, null));

另一种方法,SaveSettings(TSettings设置)不完全相反,需要设置实体和将其分解,生成在类名+ Propertyvalues的形式键 - 值对)

据实现像这样,因为它从部署概念的IoC , 接口偏析 , n层和其它图案,以确保可维护性(基于API组件化,可测试性ECC)。



文章来源: Understanding how Nop Commerce settings are loaded from the database