• ABP理论学习之设置管理


    返回总目录


    本篇目录

    介绍###

    每个应用程序都需要存储一些设置信息,然后在应用程序中的某个地方使用这些设置。ABP提供了健壮的基础设施来存储或检索服务端和客户端的应用程序,租户,用户级别的可用设置。

    一个设置一般是存储在数据库(或其他源)的name-value字符串对。我们可以将非字符串的值转换成字符串。

    关于ISettingStore

    为了使用设置系统,必须要实现ISettingStore。虽然你可以用自己的方式实现,但是它已完全实现在module-zero中了。

    定义设置###

    一个设置使用前必须先定义。ABP是模块化设计的,因此,不同的模块可以有不同的设置。要定义一个设置,一个模块应该创建一个派生于SettingProvider(设置提供器)的类。设置提供器的一个例子如下所示:

    public class MySettingProvider : SettingProvider
    {
        public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
        {
            return new[]
                    {
                        new SettingDefinition(
                            "SmtpServerAddress",
                            "127.0.0.1"
                            ),
    
                        new SettingDefinition(
                            "PassiveUsersCanNotLogin",
                            "true",
                            scopes: SettingScopes.Application | SettingScopes.Tenant
                            ),
    
                        new SettingDefinition(
                            "SiteColorPreference",
                            "red",
                            scopes: SettingScopes.User,
                            isVisibleToClients: true
                            )
    
                    };
        }
    }
    
    

    GetSettingDefinitions方法应该返回SettingDefinition集合。SettingDefinition类的构造函数有一些参数:

    • Name(必须):一个设置的名称,在系统中名称必须唯一。最好为每个设置名定义一个常量字符串。
    • Default值:设置的默认值。可以为null或空字符串。
    • Scopes:一个设置应该定义它的范围(看下面)。
    • Dispaly name:在UI上显示的本地化的设置名。
    • Description:在UI上显示的本地化的设置描述。
    • Group:用于组合设置。这个用于UI而不是设置管理。
    • IsVisibleToClients:客户端是否可见。

    创建一个设置提供器之后,我们应该在模块的PreInitialize方法中注册。

    Configuration.Settings.Providers.Add<MySettingProvider>();
    

    这样,设置提供器就自动注册到依赖注入系统中了。因此,设置提供器可以使用一些其他的资源注入任何依赖(如仓储)来生成设置定义。

    设置范围

    SettingScope枚举类中定义了三种设置范围(或者说等级)

    • Application:一个应用范围的setting对象用于用户或者租户独立的设置。比如,我们可以定义一个叫做“SmtpServerAddress”的设置来获取发送邮件时服务端的IP地址。如果该setting有一个单一值(基于用户不会改变),那么我们可以把它定义为应用范围的。
    • Tenant:如果应用程序时多租户的,那么我们可以定义租户特定的setting。
    • User:我们可以定义存储或者获取特定用户的设置。

    SettingScopes枚举类型有Flags特性,因此我们可以定义一个不止一个范围的setting。

    设置范围是有层次的,比如,如果我们定义的设置范围是“Application | Tenant | User”,并尝试获取该设置当前的值,那么:

    • 如果已定义了该用户的setting,那么就会获得该用户特定的值。
    • 如果上面的条件不成立,并且已经定义了该用户所属租户的setting,那么会获得该租户特定的值。
    • 如果上面的条件还不成立,如果定义了应用的值,那么会获得该应用的值。
    • 最后,我们会获得默认值

    默认值可能是null或者空字符串。如果可能的话,建议为setting的默认值提供默认值。

    获取设置值###

    定义了一个setting之后,我们就可以在客户端和服务端获得它当前的值。

    服务端

    ISettingManager用于执行setting操作。我们可以在应用中的任何地方注入并使用它。ISettingManager定义了许多获取一个setting值的方法。

    用的最多的方法是GetSettingValue(或者异步调用GetSettingValueAsync)。它会返回基于默认值,应用程序,租户和用户setting的当前的值(正如上面提到的)。例如:

    //获取一个bool值(异步调用)
    var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");
    
    //获取一个string值(同步调用)
    var value2 = SettingManager.GetSettingValue("SmtpServerAddress");
    
    

    GetSettingValue有泛型和异步版本,如上面所示。也有获得特定租户或者用户的setting值或者所有setting值的列表的方法。

    因为ISettingManager使用广泛,所以一些特殊的基类(如ApplicationService,DomainService和AbpController)就有了一个叫做SettingManager的属性。如果我们从这些类中派生,那么就不需要显式注入它了。

    客户端

    当定义一个setting时,如果将IsVisibleToClients设置为true,那么可以使用javascript在客户端获得当前的值。abp.setting命名空间定义了一些用得到的函数和对象。例如:

    var currentColor = abp.setting.get("SiteColorPreference");
    
    

    也有getIntgetBoolean 方法。你可以使用abp.setting.values获得所有的值。注意:如果在服务端更改了一个setting,那么如果页面没有更新,setting没有重新加载或者通过代码手动更新的话,那么客户端就不知道该setting是否发生了变化。

    更改设置###

    ISettingManager为应用程序,租户和用户分别定义了ChangeSettingForApplicationAsync, ChangeSettingForTenantAsync和ChangeSettingForUserAsync方法来更改setting。

    关于缓存###

    Setting Manager(管理者)缓存到了服务端的setting了。因此,我们不应该使用仓储或者数据库更新来直接更改一个setting的值。

  • 相关阅读:
    C#入门
    使用 OLEDB 及 SqlBulkCopy 将多个不在同一文件夹下的 ACCESS mdb 数据文件导入MSSQL
    aspose.word 读取word段落内容
    Jquery+Aajax 批量上传
    asp.net mvc web api Token验证
    iframe父页面和子页面获取元素和js变量
    JavaScrpt常用的封装方法
    ASP.NET MVC 导出Word报表
    Asp.net的对Excel文档的导入导出操作
    C++ 复制vector值到array,复制 array 到jintArray
  • 原文地址:https://www.cnblogs.com/farb/p/ABPSettingManagement.html
走看看 - 开发者的网上家园