【ABP】如何使用自带的配置表(abpsettings)对宿主、租户或者租户用户进行个性化数据配置
使用场景:系统经常需要用到一些共性或者个性化的数据配置,简单分为系统应用配置和业务应用配置系统应用配置:针对系统本身使用,基本上不会经常改动,如:环境变量、数据库链接配置 通常配置在appsettings.json中;业务应用配置:针对业务逻辑方面的一些个性化配置,如:用户打开当前网站选择的语言配置,以后打开默认上次选择的语言,这类个性化数据放在用户表感觉很违和,别扭,放在统一的配置表里面就显得优
使用场景:
系统经常需要用到一些共性或者个性化的数据配置,简单分为系统应用配置和业务逻辑配置
系统应用配置:
针对系统本身使用,基本上不会经常改动,如:环境变量、数据库链接配置 通常配置在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
更多推荐
所有评论(0)