• 入门系列-设置管理


    Settings

    配置系统 是在启动时配置应用程序很好的方式. 除了配置之外, ABP提供了另外一种设置和获取应用程序设置的方式。

    设置存储在动态数据源(通常是数据库)中的键值对. 设置系统预构建了用户,租户,全局和默认设置方法并且可以进行扩展。

    定义设置

    使用设置之前需要定义它. ABP是 模块化的, 不同的模块可以拥有不同的设置. 模块中派生 SettingDefinitionProvider 类定义模块内的配置. 示例如下:

    public class EmailSettingProvider : SettingDefinitionProvider
    {
        public override void Define(ISettingDefinitionContext context)
        {
            context.Add(
                new SettingDefinition("Smtp.Host", "127.0.0.1"),
                new SettingDefinition("Smtp.Port", "25"),
                new SettingDefinition("Smtp.UserName"),
                new SettingDefinition("Smtp.Password", isEncrypted: true),
                new SettingDefinition("Smtp.EnableSsl", "false")
            );
        }
    }
    

    ABP会自动发现并注册设置的定义。

    SettingDefinition

    SettingDefinition 类具有以下属性:

    • Name: 应用程序中设置的唯一名称. 是具有约束的唯一属性, 在应用程序获取/设置此设置的值 (设置名称定义为常量而不是magic字符串是个好主意).
    • DefaultValue: 设置的默认值.
    • DisplayName: 本地化的字符串,用于在UI上显示名称.
    • Description: 本地化的字符串,用于在UI上显示描述.
    • IsVisibleToClients: 布尔值,表示此设置是否在客户端可用. 默认为false,避免意外暴漏内部关键设置.
    • IsInherited: 布尔值,此设置值是否从其他提供程序继承. 如果没有为请求的提供程序设置设定值,那么默认值是true并回退到下一个提供程序 (参阅设置值提供程序部分了解更多).
    • IsEncrypted: 布尔值,表示是否在保存值是加密,读取时解密. 在数据库中存储加密的值.
    • Providers: 限制可用于特定的设置值提供程序(参阅设置值提供程序部分了解更多).
    • Properties: 设置此值的自定义属性 名称/值 集合,可以在之后的应用程序代码中使用.

    更改依赖模块的设置定义

    在某些情况下,你可能希望更改应用程序/模块所依赖的其他模块中定义的设置的某些属性. 设置定义提供程序可以查询和更新设置定义。

    下面的示例中获取了由 Volo.Abp.Emailing 包定义的设置并将其更改:

    public class MySettingDefinitionProvider : SettingDefinitionProvider
    {
        public override void Define(ISettingDefinitionContext context)
        {
            var smtpHost = context.GetOrNull("Abp.Mailing.Smtp.Host");
            if (smtpHost != null)
            {
                smtpHost.DefaultValue = "mail.mydomain.com";
                smtpHost.DisplayName =
                    new LocalizableString(
                        typeof(MyLocalizationResource),
                        "SmtpServer_DisplayName"
                    );
            }
        }
    }
    

    使用常量作为设置名称是一种好习惯,ABP的包就是这样做的. Abp.Mailing.Smtp设置名称是在EmailSettingNames类(在Volo.Abp.Emailing名称空间中)定义的常量。

    读取设置值

    ISettingProvider

    ISettingProvider 用于获取指定设置的值或所有设置的值. 示例用法:

    public class MyService
    {
        private readonly ISettingProvider _settingProvider;
    
        //Inject ISettingProvider in the constructor
        public MyService(ISettingProvider settingProvider)
        {
            _settingProvider = settingProvider;
        }
    
        public async Task FooAsync()
        {
            //Get a value as string.
            string userName = await _settingProvider.GetOrNullAsync("Smtp.UserName");
    
            //Get a bool value and fallback to the default value (false) if not set.
            bool enableSsl = await _settingProvider.GetAsync<bool>("Smtp.EnableSsl");
    
            //Get a bool value and fallback to the provided default value (true) if not set.
            bool enableSsl = await _settingProvider.GetAsync<bool>(
                "Smtp.EnableSsl", defaultValue: true);
    
            //Get a bool value with the IsTrueAsync shortcut extension method
            bool enableSsl = await _settingProvider.IsTrueAsync("Smtp.EnableSsl");
    
            //Get an int value or the default value (0) if not set
            int port = (await _settingProvider.GetAsync<int>("Smtp.Port"));
    
            //Get an int value or null if not provided
            int? port = (await _settingProvider.GetOrNullAsync("Smtp.Port"))?.To<int>();
        }
    }
    

    ISettingProvider 是非常常用的服务,一些基类中(如IApplicationService)已经将其属性注入. 这种情况下可以直接使用SettingProvider。

    在客户端读取设置值

    如果允许在客户端显示某个设置,可以使用 JavaScript 代码读取设置值. 示例:

    //Gets a value as string.
    var language = abp.setting.get('Abp.Localization.DefaultLanguage');
    
    //Gets an integer value.
    var requiredLength = abp.setting.getInt('Abp.Identity.Password.RequiredLength');
    
    //Gets a boolean value.
    var requireDigit = abp.setting.getBoolean('Abp.Identity.Password.RequireDigit');
    

    使用 abp.setting.values 可以读取所有设置值的字典。

    设置值提供程序

    设置系统是可扩展的, 你可以定义设置值提供程序扩展它,根据任何条件从任何来源获取设置值。

    ISettingProvider 使用设置值提供程序来获取设置值. 如果值提供程序无法获取设置值,则会回退到下一个值提供程序。

    有五个预构建设置值提供程序按以下顺序注册:

    • DefaultValueSettingValueProvider: 从设置定义的默认值中获取值(参见上面的SettingDefinition部分)。
    • ConfigurationSettingValueProvider: 从IConfiguration服务中获取值。
    • GlobalSettingValueProvider: 获取设置的全局(系统范围)值。
    • TenantSettingValueProvider: 获取当前租户的设置值(参阅 多租户文档)。
    • UserSettingValueProvider: 获取当前用户的设置值(参阅 当前用户 文档)。

    设置回退系统从底部 (用户) 到 (默认) 方向起用用.

    全局,租户和用户设置值提供程序使用 ISettingStore 从数据源读取值(参见下面的小节)。

    在应用程序配置中设置值

    上一节提到 ConfigurationSettingValueProvider 从 IConfiguration 服务中读取设置, 该服务默认从 appsettings.json 中读取值. 所以在 appsettings.json 文件中配置设置值是最简单的方式。

    例如你可以像以下方式一样配置 IEmailSender 设置:

    {
      "Settings": {
        "Abp.Mailing.DefaultFromAddress": "noreply@mydomain.com",
        "Abp.Mailing.DefaultFromDisplayName": "My Application",
        "Abp.Mailing.Smtp.Host": "mail.mydomain.com",
        "Abp.Mailing.Smtp.Port": "547",
        "Abp.Mailing.Smtp.UserName": "myusername",
        "Abp.Mailing.Smtp.Password": "mySecretPassW00rd",
        "Abp.Mailing.Smtp.EnableSsl": "True"
      }
    }
    

    设置值应该在 Settings 部分配置,如本例所示。

    IConfiguration是.NET Core的服务,它不仅可以从 appsettings.json 中读取值,还可以从环境,用户机密...等中读取值. 有关更多信息请参阅微软文档

    自定义设置值提供程序

    扩展设置系统的方式是定义一个派生自 SettingValueProvider 的类。示例:

    public class CustomSettingValueProvider : SettingValueProvider
    {
        public override string Name => "Custom";
    
        public CustomSettingValueProvider(ISettingStore settingStore) 
            : base(settingStore)
        {
        }
    
        public override Task<string> GetOrNullAsync(SettingDefinition setting)
        {
            /* Return the setting value or null
               Use the SettingStore or another data source */
        }
    }
    

    或者你直接可以实现 ISettingValueProvider 接口. 这时需要记得将其注册到 依赖注入

    每一个提供程序都应该具有唯一的名称 (这里的名称是 "Custom" ). 内置提供程序使用给定的名称:

    • DefaultValueSettingValueProvider: "D".
    • ConfigurationSettingValueProvider: "C".
    • GlobalSettingValueProvider: "G".
    • TenantSettingValueProvider: "T".
    • UserSettingValueProvider: "U".

    最好使用一个字母的名称来减少数据库中的数据大小(提供者名称在每行中重复)。

    定义自定义设置值提供程序后,需要将其显式注册到 AbpSettingOptions:

    Configure<AbpSettingOptions>(options =>
    {
        options.ValueProviders.Add<CustomSettingValueProvider>();
    });
    

    本示例将其添加到最后一项,因此它将成为ISettingProvider使用的第一个值提供程序. 你也可以将其添加到options.ValueProviders列表的另一个位置。

    ISettingStore

    尽管设置值提供程序可以自由使用任何来源来获取设置值,但 ISettingStore 服务是设置值的默认来源。全局,租户和用户设置值提供者都使用它。

    ISettingEncryptionService

    ISettingEncryptionService 用于在设置定义的 isencryption 属性设置为 true 时加密/解密设置值。

    你可以在依赖项入系统中替换此服务,自定义实现加密/解密过程. 默认实现 StringEncryptionService 使用AES算法。

    设置管理模块

    设置系统核心是相当独立的,不做任何关于如何管理(更改)设置值的假设. 默认的ISettingStore实现也是NullSettingStore,它为所有设置值返回null。

    设置管理模块通过管理数据库中的设置值来完成逻辑(实现ISettingStore).有关更多信息参阅设置管理模块学习更多。

  • 相关阅读:
    winform,WPF 释放内存垃圾,减少资源占用方法
    Winform中使用WPF控件并动态读取Xaml
    Winform程序双向绑定
    STM32L15XXX 入门笔记
    STM32固件库下载地址
    C#实现虚拟控件列表显示100w个控件方法
    DotNetBar滚动条的疑似BUG
    VS Sln图标空白修复办法
    Swift下使用Xib设计界面
    关于Mac OS虚拟机下共享文件夹的方法
  • 原文地址:https://www.cnblogs.com/fxck/p/13076391.html
Copyright © 2020-2023  润新知