2012-05-19 2 views
6

私はNop Commerceと一緒に働いていて、誰かが私の混乱を助けてくれるのだろうかと思っています。Nop Commerceの設定がデータベースからどのように読み込まれるか理解する

私は、Webアプリケーションの起動時に設定がどのように読み込まれるかを調べるために、コードを何度もデバッグしました。私はそれを得ることはありません!

すべての設定クラスは、ISettingsインターフェイスを実装しています。例えば、顧客の設定を取ることができます。私はそれがCustomerSettingsクラスによって表されることを発見しました。データベースにはSetting tableがあります。顧客の設定のためのデータは、このようなsomethngになります:

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

方法とCustomerSettingsクラスとCustomerSettingsクラスのUsernamesEnabledプロパティにマップusernamesenabledのようなプロパティにcustomersettingsからマッピングされたこれらの各設定はありますか?なぜこのように実装されたのですか?誰かが正しい方向に私を指すことができる場合

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

それをいただければ幸いです。

は、私はそれがDependencyRegistrarクラスに次のコードとは何かを持って知っています。

答えて

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

リフレクションを使用して、(例えば、CustomerSettings)*設定クラス、検査とそのプロパティは、サービスから対応する設定をロードするために使用されています。

そして、それは文字列として格納された値をバックに変換します(直列化が起こるかを確認するためにNopCustomTypeConverterを確認することができます)とバックの設定エンティティに割り当てる:

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

他の方法、SaveSettings( TSettingsの設定)は、設定エンティティを取り、それを分解してClassName + Propertyvaluesの形式でキーと値のペアを生成します)

IoC,segregation of interfacesのコンセプトを展開するので、 n-tierおよびその他のパタ​​ーンは、保守性(APIベースのコンポーネント化、テスト容易性ecc)を保証します。

+0

ありがとう、私はこれを理解することができました。 –

関連する問題