まず、モジュールのライフサイクルの定義AbpSettingsModule
SettingOptions提供ISettingDefinitionProvider、定義(ISettingDefinitionContextコンテキスト)
PreConfigureServicesモジュールでは、唯一の我々は、自動的に設定された定義に追加、ISettingDefinitionProviderを実装する必要があります。このようなメールの設定として、トラバーサルSettingDefinitionManagerのCreateSettingDefinitionsはSettingDefinitionContextを得ました
ISettingValueProviderは それぞれ、定義されたプロバイダから設けられた4つの値を提供し、デフォルトのプロバイダは、プロバイダのグローバル値、テナント値を提供して、ユーザが値を提供します
公共オーバーライドボイドPreConfigureServices(ServiceConfigurationContextコンテキスト) { AutoAddDefinitionProviders(context.Services)。 } 公共オーバーライドボイドConfigureServices(ServiceConfigurationContextコンテキスト) { 設定<SettingOptions>(オプション=> { options.ValueProviders.Add <DefaultValueSettingValueProvider>(); options.ValueProviders.Add <GlobalSettingValueProvider>(); options.ValueProviders.Add <TenantSettingValueProvider>( ); options.ValueProviders.Add <UserSettingValueProvider>(); }); } プライベートの静的な無効AutoAddDefinitionProviders(IServiceCollectionサービス) { VARのdefinitionProviders =新しいリスト<タイプ>(); services.OnRegistred(コンテキスト=> { IF(typeof演算(ISettingDefinitionProvider).IsAssignableFrom(context.ImplementationType)) { definitionProviders.Add(context.ImplementationType); } })。 services.Configure <SettingOptions>(オプション=> { options.DefinitionProviders.AddIfNotContains(definitionProviders); }); }
二、SettingProviderメインエントランス、コンストラクタのオプションで、サービス・プロバイダ、settingDefinitionManager、settingEncryptionService
メインプロパティ値を得るために
パブリック仮想非同期タスクの<string> GetOrNullAsync(文字列名) {
//获取属性值 VAR設定= SettingDefinitionManager.Get(名); VARプロバイダ=列挙 .Reverse(Providers.Value)。
IF(setting.Providers.Any()) { プロバイダ= providers.Where(P => setting.Providers.Contains(p.Name))。 } // TODO:setting.IsInheritedを実装する方法は? VaRの値は= GetOrNullValueFromProvidersAsync(プロバイダ、設定)を待ちます。
//加密 (setting.IsEncrypted)であれば { 値= SettingEncryptionService.Decrypt(設定値)。 } 戻り値。 }
タスク<ストリング> GetOrNullValueFromProvidersAsync(非同期(async)仮想保護 のIEnumerable <ISettingValueProvider>プロバイダ、 SettingDefinition設定) {
//遍历对应值提供プロバイダー、获取对应的值 のforeach(プロバイダにおけるVARプロバイダ) { VAR値= provider.GetOrNullAsync(設定)を待ちます。 もし(!値= NULL) { 戻り値; } } はnullを返します。 }
ドメインモデリングの知識
1、最初のクライアントが暗号化されたか否かを、表示リストを提供し、ユーザ定義のプロパティができるかどうか、名、表示名、説明、デフォルト値として、settingdefinition構成定義を決定します
2、settingdefinitionContextコンテキスト、定義SettingDefinition構成、ストレージ構成辞書の定義を提供する辞書<文字列、SettingDefinition>
3、SettingDefinitionProviderプロバイダ、コンフィギュレーションコンテキストが定義定義(ISettingDefinitionContextコンテキスト)
たとえば、メール設定のコンテキストで
内部 クラスEmailSettingProvider:SettingDefinitionProvider { 公共 オーバーライド ボイド(ISettingDefinitionContextコンテキスト)を定義 { context.Add( 新しい SettingDefinition(EmailSettingNames.Smtp.Host、" 127.0.0.1 " )、 新 SettingDefinition(EmailSettingNames.Smtp.Port、" 25 " )、 新しいですSettingDefinition(EmailSettingNames.Smtp.UserName)、 新しい SettingDefinition(EmailSettingNames.Smtp.Password、のIsEncrypted:真)、 新しいSettingDefinition(EmailSettingNames.Smtp.Domain)、 新しい SettingDefinition(EmailSettingNames.Smtp.EnableSsl、" 偽" )、 新 SettingDefinition(EmailSettingNames.Smtp.UseDefaultCredentials、" 真" )、 新 SettingDefinition(EmailSettingNames.DefaultFromAddress、" noreply ABP @。 IO " )、 新 SettingDefinition(EmailSettingNames.DefaultFromDisplayName、" ABPアプリ" ) ); } }
4、プロバイダー構成はISettingValueProvider、プロバイダの複数の値、など
1)デフォルトのプロバイダは、構成が定義され得ます
2)グローバルプロバイダー、ISettingStoreから値はProviderName =「グローバル」を得ます
3)値は、providerNameに=テナント、providerKey = CurrentTenant.Id ISettingStoreからの取得テナント?.ToString()
4 ISettingStore、providerNameで=ユーザから値を得る)ユーザ、providerKey = CurrentUser.Id.ToString()
5、settingdefinitionManager管理、定義はすべての設定1を定義するコンフィギュレーションへのアクセスは)全てDefinitionProviders、コンテキストコンフィギュレーションを初期化settingdefinitionContext
公共SettingDefinitionManager( IOptions <SettingOptions>オプション、 IServiceProviderサービス・プロバイダ) { のServiceProvider =サービス・プロバイダ。 オプション= options.Value。 SettingDefinitions =新しいレイジー<IDictionaryを<文字列、SettingDefinition >>(CreateSettingDefinitions、真の); } 保護された仮想たIDictionary <ストリング、SettingDefinition> CreateSettingDefinitions() { VARの設定=新しい辞書<文字列、SettingDefinition>(); 使用(VARスコープ= ServiceProvider.CreateScope()) { VARプロバイダ=オプションを .DefinitionProviders .Select(ISettingDefinitionProviderとしてP => scope.ServiceProvider.GetRequiredService(P)) .ToList(); foreachの(プロバイダにおけるVARプロバイダ) { provider.Define(新しいSettingDefinitionContext(設定))。 } } 設定を戻します。 }