6

私は一緒に働いてNop Commerceおり、誰かが私の混乱を助けてくれるかどうか疑問に思っています。

Webアプリケーションの起動時に設定がどのように読み込まれるかを調べようとして、コードを何度もデバッグしました。わからない!

すべての設定クラスはISettingsインターフェースを実装します。顧客の設定を例にとってみましょう。CustomerSettingsクラスによって表されていることがわかりました。データベースには。がありますSetting table。顧客設定のデータは次のようになります。

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

これらの各設定は、どのように、どこからcustomersettingsクラスCustomerSettingsusernamesenabledマップされ、UsernamesEnabledプロパティは、CustomerSettingsクラスのプロパティにマップされますか?そして、なぜそれがこのように実装されたのですか?

私はそれが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));

もう1つのメソッドであるSaveSettings(TSettings settings)は、正反対のことを行い、Settingエンティティを取得して分解し、ClassName + Propertyvaluesの形式でキーと値のペアを生成します)

IoCの概念、インターフェイスの分離n層、およびその他のパタ​​ーンを展開して保守性(APIベースのコンポーネント化、テスト容易性など)を確保するため、このように実装されました。

于 2012-06-01T13:42:10.257 に答える