使用场景:

系统经常需要用到一些共性或者个性化的数据配置,简单分为系统应用配置业务逻辑配置

系统应用配置:
针对系统本身使用,基本上不会经常改动,如:环境变量、数据库链接配置 通常配置在appsettings.json中;

业务逻辑配置:
针对业务逻辑方面的一些个性化配置,如:用户打开当前网站选择的语言配置,以后打开默认上次选择的语言,这类个性化数据放在用户表感觉很违和,别扭,放在统一的配置表里面就显得优雅许多,abp默认系统架构提供了这么一张表:abpsettings 也封装了对应的方法可以直接使用;

配置数据加载:
系统启动或者启动后某个用户访问应用的时候,系统会自动加载和租户以及和当前登录用户相关的所有配置数据,方便使用SettingManager动态读写配置数据,不管前端是否有调用此数据。

AbpSettings表结构:

在这里插入图片描述
重点在TenantId(归属租户Id)、UserId(归属用户Id)、Name(属性名称)、Value(属性值)
可以灵活配置某条记录归于租户、 某个租户下的某个用户、如果租户Id和用户Id都没有 则是分配给应用宿主;

AbpSettings表数据读写:

  //应用层或者领域层注入配置管理类
  public class xxxAppService
    {
    	//注入AbpSettings表对应的操作类
        private readonly SettingManager _settingManager;
        public TaskAppService(SettingManager settingManager)
        {
            _settingManager = settingManager;
        }      
        //测试方法
        public void Test()
        {           
        	//提取租户标号12 名为TestName的记录值
            string tmpValue = await _settingManager.GetSettingValueForTenantAsync("TestName", 12);
            //提取租户编号12 用户编号24 名为TestName的记录
            string tmpValue2 = _settingManager.GetSettingValueForUser("TestName", 12,24);
            //动态给用户9527设置个性化配置数据(底层会自动识别是新增还是修改)
			_settingManager.ChangeSettingForUser(9527,"TestName","唐白虎");
        }            
  	}

ABP底层源代码:简单贴个例子 还有很多现成方法 大体就是Changexxx和 Getxxx 2大类方法

   //所有ChangeXXX方法 都是用的 InsertOrUpdateOrDeleteSettingValue自动识别新增、修改或者删除数据,至于他是如何包含删除配置功能的 哈哈这个比较有意思 不告诉你
   public void ChangeSettingForUser(UserIdentifier user, string name, string value)
        {
            InsertOrUpdateOrDeleteSettingValue(name, value, user.TenantId, user.UserId);
            _userSettingCache.Remove(user.ToUserIdentifierString());
        }

注意事项:

直接通过自带的SettingManager提供的方法还不能随心所欲的读写自定义数据,会提示如下错误:
Abp.AbpException: There is no setting defined with name: TestName
at Abp.Configuration.SettingDefinitionManager.GetSettingDefinition(String name)
at Abp.Configuration.SettingManager.ConvertSettingInfosToDictionary(List`1 settingValues)**

大概意思就是缺少相关配置。

添加自定义属性配置信息:

在应用层新建SelfProvider.cs 类 然后在对应的 xxxModule模块中进行注册。

1、在 应用层 xxxApplication 创建SelfProvider.cs 类:

 public class SelfProvider : SettingProvider
    {
        public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
        {
	        //如果数据定义比较多,可用字典Dictionary<string, string>存储各种 Name和对应的value 然后循环字典配置 做如上配置
            return new[]
            {
            	//TestName 是自定义属性名称 也是存储在数据库中的Name值
            	//L("TestName") 是本地化XML资源中配置的属性节点,通过这个节点名字提取对应的描述信息
                new SettingDefinition("TestName","默认值", L("TestName"), scopes: SettingScopes.Application|SettingScopes.Tenant|SettingScopes.User)new SettingDefinition("TestName2","默认值2", L("TestName2"), scopes: SettingScopes.All)                
            };
        }        
    }

2、在 应用层 xxxModule.cs模块中注册SelfProvider.cs 类:

 public class NetEarnMultiTenancyApplicationModule : AbpModule
    {
        public override void PreInitialize()
        {
            //注册SelfProvider
            Configuration.Settings.Providers.Add<SelfProvider>();
            *****************************************************           
        }
    }

3、在 领域层 xxx.core 添加自定义属性对应的本地化资源:
英文资源配置文件:NetEarnMultiTenancy.xml
中文资源配置文件:NetEarnMultiTenancy-zh-Hans.xml

<text name="ResetPasswordStepOneInfo">1. Enter your administrator password</text>
<text name="ResetPasswordStepTwoInfo">2. Copy this random password so you can send it to the user</text>
<text name="TestName">测试名称</text>    
// TestName 要和 L("TestName") 中的名字一直才行

在这里插入图片描述

小结:

当然也可以不用ABP自带的SettingManager,也就不用SelfProvider.cs 自定属性配置这一步;改用自己完全通过AbpSettings表的数据库上下文进行增删改查。 _context.Settings.Add(new Setting(tenantId, null, name, value));

个人建议还是添加一个配置,然后随心所欲的使用SettingManager里面提供的适合各种业务场景的现成方法,难道不香码?自己造轮子没必要;

有朋自远方来 虽远必诛,欢迎加微交流: 15249207822

Logo

开源、云原生的融合云平台

更多推荐