项目

设置管理模块

设置管理模块实现了 ISettingStore(参见设置系统),用于将设置值存储在数据库中,并提供 ISettingManager 来管理(更改)数据库中的设置值。

对于启动模板,设置管理模块已经安装并配置。因此,在大多数情况下,您无需手动将此模块添加到您的应用程序中。

ISettingManager

ISettingManager 用于获取和设置配置项的值。示例:

using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.SettingManagement;

namespace Demo
{
    public class MyService : ITransientDependency
    {
        private readonly ISettingManager _settingManager;

        //注入 ISettingManager 服务
        public MyService(ISettingManager settingManager)
        {
            _settingManager = settingManager;
        }

        public async Task FooAsync()
        {
            Guid user1Id = ...;
            Guid tenant1Id = ...;

            //为当前用户或指定用户获取/设置设置值
            
            string layoutType1 =
                await _settingManager.GetOrNullForCurrentUserAsync("App.UI.LayoutType");
            string layoutType2 =
                await _settingManager.GetOrNullForUserAsync("App.UI.LayoutType", user1Id);

            await _settingManager.SetForCurrentUserAsync("App.UI.LayoutType", "LeftMenu");
            await _settingManager.SetForUserAsync(user1Id, "App.UI.LayoutType", "LeftMenu");

            //为当前租户或指定租户获取/设置设置值
            
            string layoutType3 =
                await _settingManager.GetOrNullForCurrentTenantAsync("App.UI.LayoutType");
            string layoutType4 =
                await _settingManager.GetOrNullForTenantAsync("App.UI.LayoutType", tenant1Id);
            
            await _settingManager.SetForCurrentTenantAsync("App.UI.LayoutType", "LeftMenu");
            await _settingManager.SetForTenantAsync(tenant1Id, "App.UI.LayoutType", "LeftMenu");

            //获取/设置全局和默认设置值
            
            string layoutType5 =
                await _settingManager.GetOrNullGlobalAsync("App.UI.LayoutType");
            string layoutType6 =
                await _settingManager.GetOrNullDefaultAsync("App.UI.LayoutType");

            await _settingManager.SetGlobalAsync("App.UI.LayoutType", "TopMenu");
        }
    }
}

因此,您可以为不同的设置值提供程序(默认、全局、用户、租户...等)获取或设置设置值。

如果您只需要读取设置值,请使用 ISettingProvider 而不是 ISettingManager,因为它实现了缓存并支持所有部署场景。如果您正在创建设置管理UI,则可以使用 ISettingManager

设置缓存

设置值使用分布式缓存系统进行缓存。始终使用 ISettingManager 来更改设置值,它会为您管理缓存。

设置管理提供程序

设置管理模块是可扩展的,就像设置系统一样。您可以通过定义设置管理提供程序来扩展它。有5个预置的设置管理提供程序按以下顺序注册:

  • DefaultValueSettingManagementProvider:从设置定义的默认值中获取值。它无法设置默认值,因为默认值在设置定义中是硬编码的。
  • ConfigurationSettingManagementProvider:从IConfiguration服务中获取值。它无法设置配置值,因为无法在运行时更改配置值。
  • GlobalSettingManagementProvider:获取或设置设置的全局(系统范围)值。
  • TenantSettingManagementProvider:获取或设置租户的设置值。
  • UserSettingManagementProvider:获取用户的设置值。

ISettingManager 在 get/set 方法上使用设置管理提供程序。通常,每个设置管理提供程序都会在 ISettingManagement 服务上定义扩展方法(例如用户设置管理提供程序定义的 SetForUserAsync)。

如果您想创建自己的提供程序,请实现 ISettingManagementProvider 接口或继承 SettingManagementProvider 基类:

public class CustomSettingProvider : SettingManagementProvider, ITransientDependency
{
    public override string Name => "Custom";

    public CustomSettingProvider(ISettingManagementStore store) 
        : base(store)
    {
    }
}

SettingManagementProvider 基类为您提供了默认实现(使用 ISettingManagementStore)。您可以根据需要重写基类方法。每个提供程序必须有一个唯一的名称,在本例中为 Custom(请保持简短,因为它会为每个设置值记录保存到数据库中)。

创建提供程序类后,您应该使用 SettingManagementOptions 选项类来注册它:

Configure<SettingManagementOptions>(options =>
{
    options.Providers.Add<CustomSettingProvider>();
});

提供程序的顺序很重要。提供程序按相反顺序执行。这意味着对于此示例,CustomSettingProvider 将首先执行。您可以在 Providers 列表中以任意顺序插入您的提供程序。

另请参阅

设置管理UI

设置管理模块默认提供了电子邮件设置、功能管理和时区设置UI。

EmailSettingUi

您可以单击发送测试电子邮件按钮来发送测试电子邮件以检查您的电子邮件设置。

FeatureManagementUi

TimeZoneSettingUi

它是可扩展的;您可以为此页面添加自己的选项卡以管理应用程序设置。

MVC UI

创建设置视图组件

Components 文件夹下创建 MySettingGroup 文件夹。添加一个新的视图组件。将其命名为 MySettingGroupViewComponent

MySettingGroupViewComponent

打开 MySettingGroupViewComponent.cs 并将整个内容更改为如下所示:

public class MySettingGroupViewComponent : AbpViewComponent
{
    public virtual IViewComponentResult Invoke()
    {
        return View("~/Components/MySettingGroup/Default.cshtml");
    }
}

您也可以使用 InvokeAsync 方法,在本例中,我们使用 Invoke 方法。

Default.cshtml

MySettingGroup 文件夹下创建一个 Default.cshtml 文件。

打开 Default.cshtml 并将整个内容更改为如下所示:

<div>
  <p>我的设置组页面</p>
</div>

BookStoreSettingPageContributor

Settings 文件夹下创建一个 BookStoreSettingPageContributor.cs 文件:

BookStoreSettingPageContributor

文件内容如下:

public class BookStoreSettingPageContributor : ISettingPageContributor
{
    public Task ConfigureAsync(SettingPageCreationContext context)
    {
        context.Groups.Add(
            new SettingPageGroup(
                "Volo.Abp.MySettingGroup",
                "MySettingGroup",
                typeof(MySettingGroupViewComponent),
                order : 1
            )
        );

        return Task.CompletedTask;
    }

    public Task<bool> CheckPermissionsAsync(SettingPageCreationContext context)
    {
        // 您可以在此处检查权限
        return Task.FromResult(true);
    }
}

打开 BookStoreWebModule.cs 文件并添加以下代码:

Configure<SettingManagementPageOptions>(options =>
{
    options.Contributors.Add(new BookStoreSettingPageContributor());
});

运行应用程序

导航到 /SettingManagement 路由以查看更改:

Custom Settings Tab

Blazor UI

创建 Razor 组件

Pages 文件夹下创建 MySettingGroup 文件夹。添加一个新的 Razor 组件。将其命名为 MySettingGroupComponent

MySettingGroupComponent

打开 MySettingGroupComponent.razor 并将整个内容更改为如下所示:

<Row>
    <p>我的设置组</p>
</Row>

BookStoreSettingComponentContributor

Settings 文件夹下创建一个 BookStoreSettingComponentContributor.cs 文件:

BookStoreSettingComponentContributor

文件内容如下:

public class BookStoreSettingComponentContributor : ISettingComponentContributor
{
    public Task ConfigureAsync(SettingComponentCreationContext context)
    {
        context.Groups.Add(
            new SettingComponentGroup(
                "Volo.Abp.MySettingGroup",
                "MySettingGroup",
                typeof(MySettingGroupComponent),
                order : 1
            )
        );

        return Task.CompletedTask;
    }

    public Task<bool> CheckPermissionsAsync(SettingComponentCreationContext context)
    {
        // 您可以在此处检查权限
        return Task.FromResult(true);
    }
}

打开 BookStoreBlazorModule.cs 文件并添加以下代码:

Configure<SettingManagementComponentOptions>(options =>
{
    options.Contributors.Add(new BookStoreSettingComponentContributor());
});

运行应用程序

导航到 /setting-management 路由以查看更改:

Custom Settings Tab

Angular UI

创建组件

使用以下命令创建一个组件:

yarn ng generate component my-settings

打开 app.component.ts 并按如下所示修改文件:

import { Component, inject } from '@angular/core';
import { SettingTabsService } from '@abp/ng.setting-management/config';
import { MySettingsComponent } from './my-settings/my-settings.component';

@Component({
  // 组件元数据
})
export class AppComponent {
  private readonly settingTabs = inject(SettingTabsService);

  constructor() {
    this.settingTabs.add([
      {
        name: 'MySettings',
        order: 1,
        requiredPolicy: 'policy key here',
        component: MySettingsComponent,
      },
    ]);
  }
}

运行应用程序

导航到 /setting-management 路由以查看更改:

Custom Settings Tab

在本文档中