我有工作Nop Commerce
和想知道,如果有人可以帮我与我的困惑。
我已经调试代码多次试图找出的设置是如何加载在Web应用程序的启动起来。 我只是不明白这一点!
所有设置类实现ISettings
接口。 让我们的客户例如设置..我已经发现,它是由代表CustomerSettings
类。 在数据库中有一个Setting table
。 为客户设置数据看起来somethng是这样的:
customersettings.usernamesenabled
customersettings.checkusernameavailabilityenabled
customersettings.allowuserstochangeusernames
... and so on...
每个设置从映射如何以及在何处customersettings
到CustomerSettings
类,并像一个属性usernamesenabled
映射到UsernamesEnabled
在CustomerSettings类属性? 以及为什么它这种方式来实现?
我知道它是与在下面的代码DependencyRegistrar
类:
builder.RegisterGeneric(typeof(ConfigurationProvider<>)).As(typeof(IConfigurationProvider<>));
builder.RegisterSource(new SettingsSource());
如果有人能在正确的方向指向我,然后我们将不胜感激。
希望我没有迟到。
只有一些相关的点,看明白是如何创建的结构:
-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)。