设置管理

介绍

每个应用程序都需要存储一些设置,并在应用程序的某个位置使用这些设置。ASP.NET Boilerplate提供了一个强大的基础架构来存储/检索服务器客户端上可用的应用程序租户和 用户级别设置

设置是名称 - 值字符串对,通常存储在数据库(或其他源)中。我们可以通过将非字符串值转换为字符串来存储它们。

关于ISettingStore

ISettingStore接口必须以使用设置系统来实现。虽然您可以以自己的方式实现它,但它完全在Module Zero项目中实现。如果未实现,则从应用程序的配置文件(web.config或app.config)中读取设置,但不能更改这些设置。范围界定也不起作用。

定义设置

必须在使用前定义设置。ASP.NET Boilerplate设计为模块化,因此不同的模块可以具有不同的设置。模块必须创建从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,
                        clientVisibilityProvider: new VisibleSettingClientVisibilityProvider()
                        )

                };
    }
}

GetSettingDefinitions方法返回SettingDefinition 对象。SettingDefinition类在它的构造函数中有一些参数:

创建设置提供程序后,我们必须在我们模块的PreIntialize方法中注册它:

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

设置提供程序通过依赖注入自动注册设置提供程序可以使用其他一些源来注入任何依赖项(如存储库)来构建设置定义。

设定范围

SettingScopes枚举中定义了 三个设置范围(或级别) 

SettingScopes枚举具有Flags属性,因此我们可以定义具有多个范围的设置

默认情况下,设置范围是分层的(除非您将isInherited设置 为false)。例如,如果我们将设置的范围定义为“Application | Tenant | User”并尝试获取该设置的当前值 ;

默认值可以为null字符串。建议您尽可能为设置提供默认值。

覆盖设置定义

context.Manager可用于获取设置定义以更改其值。通过这种方式,您可以操作依赖模块的设置定义

获取设定值

定义设置后,我们可以在服务器和客户端上获取其当前值。

服务器端

ISettingManager

ISettingManager用于执行设置操作。我们可以在应用程序的任何地方注入和使用它。ISettingManager定义了许多获取设置值的方法。

最常用的方法是GetSettingValue(或异步调用的GetSettingValueAsync)。根据默认值,应用程序,租户和用户设置返回设置的当前值(如之前的设置范围部分所述)。例子:

//Getting a boolean value (async call)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");

//Getting a string value (sync call)
var value2 = SettingManager.GetSettingValue("SmtpServerAddress");

GetSettingValue具有泛型和异步版本,如上所示。还有一些方法可以获取特定租户或用户的设置值或所有设置值的列表。

由于ISettingManager被广泛使用,因此一些特殊的基类 (如ApplicationService,DomainService和AbpController)具有名为SettingManager的属性如果我们从这些类派生,就没有必要明确地注入它。

ISettingDefinitionManager

ISettingDefinitionManager可用于获取定义的设置定义AppSettingProvider我们也可以在应用程序的任何地方注入和使用它。您可以使用获取定义名称,默认值,显示名称等ISettingDefinitionManager

客户端

设置定义的ClientVisibilityProvider属性确定客户端设置的可见性。ISettingClientVisibilityProvider有四种实现方式。

如果客户端根据设置定义的ClientVisibilityProvider可以看到设置,那么您可以使用JavaScript在客户端获取它的当前值。所述abp.setting命名空间定义的所需要的功能和对象。例:

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

还有getIntgetBoolean方法。您可以使用abp.setting.values对象获取所有值请注意,如果更改服务器端的设置,则除非刷新页面,以某种方式重新加载设置或通过代码手动更新,否则客户端无法知道此更改。

更改设置

ISettingManager定义ChangeSettingForApplicationAsync, ChangeSettingForTenantAsyncChangeSettingForUserAsync 方法(以及同步版本)以分别为租户和用户更改应用程序的设置。

关于缓存

设置管理器在服务器端缓存设置,因此我们不应使用存储库或数据库更新查询直接更改设置值。

nidie.com.cn - 用心与你沟通