6

我正在和我一起工作,Nop Commerce想知道是否有人可以帮助我解决我的困惑。

我已经多次调试代码,试图找出在启动 Web 应用程序时如何加载设置。我就是不明白!

所有设置类都实现该ISettings接口。让我们以客户设置为例。我发现它由CustomerSettings类表示。在数据库中有一个Setting table. 客户设置的数据如下所示:

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

这些设置中的每一个是如何以及在哪里映射customersettingsCustomerSettings类以及一个属性(如usernamesenabled映射到UsernamesEnabledCustomerSettings 类中的属性)的?为什么它是这样实施的?

我知道这与DependencyRegistrar类中的以下代码有关:

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

如果有人能指出我正确的方向,那将不胜感激。

4

1 回答 1

7

希望我没有迟到。

要了解如何创建该结构,只需查看几个相关点:

-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 };

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

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

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

另一种方法 SaveSettings(TSettings settings) 则完全相反,采用 Setting 实体并将其分解,生成 ClassName+Propertyvalues 形式的键值对)

之所以这样实现,是因为它部署了来自IoC接口分离n 层和其他模式的概念,以确保可维护性(基于 API 的组件化、可测试性 ecc)。

于 2012-06-01T13:42:10.257 回答