设置管理模块

设置管理模块实现了 ISettingStore (参阅 设置系统) 将设置值存储在数据库中, 并提供 ISettingManager 管理 (更改) 数据库中设置值的功能.

启动模板默认安装并配置了设置管理模块. 大部分情况下你不需要手动的添加该到模块到应用程序中.

ISettingManager

ISettingManager 用于获取和设定设置值. 示例:

  1. using System;
  2. using System.Threading.Tasks;
  3. using Volo.Abp.DependencyInjection;
  4. using Volo.Abp.SettingManagement;
  5. namespace Demo
  6. {
  7. public class MyService : ITransientDependency
  8. {
  9. private readonly ISettingManager _settingManager;
  10. //Inject ISettingManager service
  11. public MyService(ISettingManager settingManager)
  12. {
  13. _settingManager = settingManager;
  14. }
  15. public async Task FooAsync()
  16. {
  17. Guid user1Id = ...;
  18. Guid tenant1Id = ...;
  19. //Get/set a setting value for the current user or the specified user
  20. string layoutType1 =
  21. await _settingManager.GetOrNullForCurrentUserAsync("App.UI.LayoutType");
  22. string layoutType2 =
  23. await _settingManager.GetOrNullForUserAsync("App.UI.LayoutType", user1Id);
  24. await _settingManager.SetForCurrentUserAsync("App.UI.LayoutType", "LeftMenu");
  25. await _settingManager.SetForUserAsync(user1Id, "App.UI.LayoutType", "LeftMenu");
  26. //Get/set a setting value for the current tenant or the specified tenant
  27. string layoutType3 =
  28. await _settingManager.GetOrNullForCurrentTenantAsync("App.UI.LayoutType");
  29. string layoutType4 =
  30. await _settingManager.GetOrNullForTenantAsync("App.UI.LayoutType", tenant1Id);
  31. await _settingManager.SetForCurrentTenantAsync("App.UI.LayoutType", "LeftMenu");
  32. await _settingManager.SetForTenantAsync(tenant1Id, "App.UI.LayoutType", "LeftMenu");
  33. //Get/set a global and default setting value
  34. string layoutType5 =
  35. await _settingManager.GetOrNullGlobalAsync("App.UI.LayoutType");
  36. string layoutType6 =
  37. await _settingManager.GetOrNullDefaultAsync("App.UI.LayoutType");
  38. await _settingManager.SetGlobalAsync("App.UI.LayoutType", "TopMenu");
  39. }
  40. }
  41. }

你可以从不同的设置值提供程序中(默认,全局,用户,租户…等)中获取或设定设置值.

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

Setting Cache

设置值缓存在 分布式缓存 系统中. 建议始终使用 ISettingManager 更改设置值.

Setting Management Providers

设置管理模块是可扩展的,像设置系统一样. 你可以通过自定义设置管理提供程序进行扩展. 有5个预构建的设置管理程序程序按以下顺序注册:

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

ISettingManagerget/set 方法中使用设置管理提供程序. 通常每个设置程序提供程序都在 ISettingManagement 服务上定义了模块方法 (比如用户设置管理程序提供定义了 SetForUserAsync 方法).

Setting Management UI.

设置管理模块默认提供了邮件设置页面并且它是可扩展的; 你可以为你的应用程序设置添加设置标签到设置页面.

MVC UI

创建视图组件

Components 目录下创建 MySettingGroup 文件夹, 添加一个名为 MySettingGroupViewComponent 的视图组件:

MySettingGroupViewComponent

打开 MySettingGroupViewComponent.cs 替换为以下内容:

  1. public class MySettingGroupViewComponent : AbpViewComponent
  2. {
  3. public virtual IViewComponentResult Invoke()
  4. {
  5. return View("~/Components/MySettingGroup/Default.cshtml");
  6. }
  7. }

你还可以使用 InvokeAsync 方法,在这个示例中我们使用 Invoke 方法.

Default.cshtml

MySettingGroup 目录下创建 Default.cshtml 文件.

打开 Default.cshtml 替换为以下内容:

  1. <div>
  2. <p>My setting group page</p>
  3. </div>

BookStoreSettingPageContributor

Settings 目录下创建 BookStoreSettingPageContributor.cs 文件.

BookStoreSettingPageContributor

文件内容如下:

  1. public class BookStoreSettingPageContributor : ISettingPageContributor
  2. {
  3. public Task ConfigureAsync(SettingPageCreationContext context)
  4. {
  5. context.Groups.Add(
  6. new SettingPageGroup(
  7. "Volo.Abp.MySettingGroup",
  8. "MySettingGroup",
  9. typeof(MySettingGroupViewComponent)
  10. )
  11. );
  12. return Task.CompletedTask;
  13. }
  14. public Task<bool> CheckPermissionsAsync(SettingPageCreationContext context)
  15. {
  16. // You can check the permissions here
  17. return Task.FromResult(true);
  18. }
  19. }

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

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

运行应用程序

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

Custom Settings Tab

Blazor UI

创建 Razor 组件

Pages 目录下创建 MySettingGroup 文件夹, 添加一个名为 MySettingGroupComponent 的Razor组件:

MySettingGroupComponent

打开 MySettingGroupComponent.razor 替换为以下内容:

  1. <Row>
  2. <p>my setting group</p>
  3. </Row>

BookStoreSettingComponentContributor

Settings 目录下创建 BookStoreSettingComponentContributor.cs 文件.

BookStoreSettingComponentContributor

文件内容如下:

  1. public class BookStoreSettingComponentContributor : ISettingComponentContributor
  2. {
  3. public Task ConfigureAsync(SettingComponentCreationContext context)
  4. {
  5. context.Groups.Add(
  6. new SettingComponentGroup(
  7. "Volo.Abp.MySettingGroup",
  8. "MySettingGroup",
  9. typeof(MySettingGroupComponent)
  10. )
  11. );
  12. return Task.CompletedTask;
  13. }
  14. public Task<bool> CheckPermissionsAsync(SettingComponentCreationContext context)
  15. {
  16. // You can check the permissions here
  17. return Task.FromResult(true);
  18. }
  19. }

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

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

运行应用程序

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

Custom Settings Tab

Angular UI

不同的模块提供它们的设置选项卡. 你可以通过3个步骤在项目中自定义设置页面.

创建组件

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

  1. yarn ng generate component my-settings

打开 app.component.ts 做以下修改:

  1. import { Component } from '@angular/core';
  2. import { SettingTabsService } from '@abp/ng.setting-management/config'; // imported SettingTabsService
  3. import { MySettingsComponent } from './my-settings/my-settings.component'; // imported MySettingsComponent
  4. @Component(/* component metadata */)
  5. export class AppComponent {
  6. constructor(private settingTabs: SettingTabsService) // injected MySettingsComponent
  7. {
  8. // added below
  9. settingTabs.add([
  10. {
  11. name: 'MySettings',
  12. order: 1,
  13. requiredPolicy: 'policy key here',
  14. component: MySettingsComponent,
  15. },
  16. ]);
  17. }
  18. }

运行应用程序

导航到 /setting-management 路由你会看到以下变化:

Custom Settings Tab